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.Pathjava.nio.file.Pathsjava.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,因为它们语义更清晰、异常更明确、功能更丰富。