Wrayの知识库 Wrayの知识库
首页
  • Java 基础
  • Java 集合
  • Java 并发
  • Java IO
  • JVM
  • Spring Framework
  • Spring Boot
  • Spring Cloud
  • Spring Security
  • MySQL
  • Redis
  • 计算机基础
  • 操作系统原理
  • Linux
  • MacOS
  • Windows
  • 系统工程与研究专题
  • AI 基础
  • 大模型基础
  • Prompt 工程
  • RAG 检索增强生成
  • Agent 智能体
  • AI 应用开发
  • AI 工程化
  • AI 安全与治理
  • AI 面试与设计题
  • 纸质书
  • 电子书
  • 学习课程
疑难杂症
GitHub (opens new window)
首页
  • Java 基础
  • Java 集合
  • Java 并发
  • Java IO
  • JVM
  • Spring Framework
  • Spring Boot
  • Spring Cloud
  • Spring Security
  • MySQL
  • Redis
  • 计算机基础
  • 操作系统原理
  • Linux
  • MacOS
  • Windows
  • 系统工程与研究专题
  • AI 基础
  • 大模型基础
  • Prompt 工程
  • RAG 检索增强生成
  • Agent 智能体
  • AI 应用开发
  • AI 工程化
  • AI 安全与治理
  • AI 面试与设计题
  • 纸质书
  • 电子书
  • 学习课程
疑难杂症
GitHub (opens new window)
  • Java章节编写规范
  • Java基础

  • Java集合

  • Java并发

  • Java IO

    • Java IO概述
    • IO基础

    • 常用IO流

    • 文件与目录操作

      • File类
        • 1. File 表示路径
        • 2. 常用方法
        • 3. mkdir 和 mkdirs
        • 4. delete 的限制
        • 5. listFiles 可能返回 null
        • 6. File 的不足
        • 7. File 与 Path 转换
        • 专家实践清单
        • Tips 快问快答
        • 8. 总结
      • Files与Paths
      • 文件遍历与监听
      • 临时文件与目录
    • Java NIO

    • 高级主题

    • 实践与性能优化

    • 面试与设计题

    • IO实践速查

  • JVM

目录

File类

java.io.File 是 Java 早期用于表示文件和目录路径的类。它既可以表示文件,也可以表示目录,但它并不代表文件内容本身。

# 1. File 表示路径

File file = new File("data/app.log");

这行代码只是创建了一个路径对象,不会真正创建磁盘文件。

System.out.println(file.exists());
System.out.println(file.isFile());
System.out.println(file.isDirectory());

只有调用创建、删除、重命名等方法时,才会影响文件系统。

# 2. 常用方法

判断信息:

file.exists();
file.isFile();
file.isDirectory();
file.canRead();
file.canWrite();
file.length();
file.lastModified();

路径信息:

file.getName();
file.getPath();
file.getAbsolutePath();
file.getParent();

创建和删除:

file.createNewFile();
file.delete();
file.mkdir();
file.mkdirs();

列出目录:

File[] files = dir.listFiles();

# 3. mkdir 和 mkdirs

mkdir() 只创建一级目录,如果父目录不存在会失败。

mkdirs() 会创建多级目录。

File dir = new File("data/2026/06");
boolean created = dir.mkdirs();

实际开发中创建目录通常使用 mkdirs() 或 Files.createDirectories()。

# 4. delete 的限制

delete() 删除文件或空目录。

如果目录非空,删除会失败。

boolean deleted = file.delete();

delete() 只返回 boolean,失败原因不明确。相比之下,Files.delete 会抛出更具体的异常,更适合生产代码。

# 5. listFiles 可能返回 null

File[] files = dir.listFiles();
if (files != null) {
    for (File child : files) {
        System.out.println(child.getName());
    }
}

listFiles() 在路径不存在、不是目录、发生 IO 错误或权限不足时可能返回 null。直接遍历可能触发 NullPointerException。

# 6. File 的不足

File 类有一些历史局限:

  • 很多方法失败时只返回 boolean,错误信息不足。
  • 对符号链接、文件属性、权限等支持有限。
  • 路径处理能力不如 Path。
  • 异常表达不如 NIO.2 清晰。

现代 Java 更推荐使用:

  • java.nio.file.Path
  • java.nio.file.Paths
  • java.nio.file.Files

# 7. File 与 Path 转换

File file = new File("data.txt");
Path path = file.toPath();

File back = path.toFile();

维护老代码时经常需要在两者之间转换。

# 专家实践清单

操作 File 写法特点 更推荐的现代方式
判断文件 多数返回 boolean Files.isRegularFile
创建目录 mkdir / mkdirs Files.createDirectories
删除文件 返回 boolean Files.delete 获取异常原因
遍历目录 listFiles Files.walkFileTree
路径转换 toPath 直接使用 Path

File 的概念模型:

File 对象
  │
  ├─ 表示路径名
  ├─ 可查询文件属性
  ├─ 可执行简单操作
  └─ 不代表文件一定存在

# Tips 快问快答

Q:File 对象一定代表真实存在的文件吗? A:不一定,它只是一个路径名抽象,路径对应的文件可以不存在。

Q:File 最大的问题是什么? A:很多失败只返回 false,无法直接知道具体失败原因。

Q:新项目为什么更推荐 Path 和 Files? A:语义更清晰,异常更明确,文件系统能力更完整。

Q:mkdir 和 mkdirs 有什么区别? A:mkdir 只创建一级目录,mkdirs 会创建不存在的父目录。

Q:delete 返回 false 怎么排查? A:可能是文件不存在、权限不足、目录非空或被进程占用。

Q:File.separator 还有必要吗? A:手写路径拼接时可用,但现代代码优先使用 Path.resolve。

Q:File 和 Path 能互转吗? A:可以,file.toPath() 和 path.toFile()。

Q:维护老代码时如何处理 File? A:保留外部接口兼容,内部可尽量转换为 Path 和 Files 实现。

# 8. 总结

File 是 Java 早期文件 API,适合理解基本文件操作和维护老代码。新项目中,推荐优先使用 Path 和 Files,因为它们语义更清晰、异常更明确、功能更丰富。

上次更新: 2026/06/25, 14:19:18
管道流
Files与Paths

← 管道流 Files与Paths→

Copyright © 2023-2026 Wray | 鄂ICP备2024050235号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式