File类核心是“只管路径、不碰内容”,专注元数据查询、路径拼接与目录遍历;对象创建不触发I/O,exists()等方法才访问磁盘;拼路径优先用/或File.separator;listFiles()可能返回null需判空;getCanonicalPath可归一化路径并校验有效性。

掌握 File 类的关键不在死记方法,而在理解它“只管路径、不碰内容”的设计逻辑。它不读写文件,只帮你定位、判断、组织和遍历——元数据查询、路径拼接、目录遍历这三类操作,都围绕这个核心展开。
查元数据:别调用就以为存在
File 类提供的是“快照式”信息获取,所有 exists()、isDirectory()、length()、lastModified() 这类方法,都是在调用时才真正访问磁盘。这意味着:
- 对象创建不触发 I/O,
new File("data/config.txt")不检查文件是否真有 -
必须先调用
exists()再查类型或大小,否则length()对不存在的文件返回 0,lastModified()返回 0L,容易误判 -
getName()只取最后一段名称,getParent()返回父路径字符串(可能为 null),getAbsolutePath()是构造路径转成绝对形式,但含冗余(如./)
拼路径:拒绝硬编码斜杠
Windows 用 ,Linux/macOS 用 /,但 Java 在所有系统上都能识别 /。所以最简方案是直接写 /;若需显式跨平台兼容,优先用 File.separator 或更现代的 Paths.get():
- 字符串拼接:
"config" + File.separator + "app.properties" - 推荐方式(NIO):
Paths.get("config", "app.properties").toFile()—— 自动处理分隔符,还能链式调用resolve() - 避免
"config\" + "app.properties":反斜杠要双写,易出错且不跨平台
遍历目录:listFiles() 的空与 null 很关键
listFiles() 返回 File[],但它在多种情况下返回 null,不是空数组:
- 路径不存在 → null
- 路径是普通文件(非目录)→ null
- 路径是目录但无权限访问 → null
- 路径是空目录 → 长度为 0 的数组
安全写法总是先判空再遍历:
File dir = new File("logs");
if (dir.exists() && dir.isDirectory()) {
File[] files = dir.listFiles();
if (files != null) {
for (File f : files) { /* 处理 */ }
}
}
进阶提醒:路径规范化用 getCanonicalPath
当路径含 ../ 或 ./ 时,getAbsolutePath() 只是简单拼接,而 getCanonicalPath() 会真实解析并归一化(比如把 D:proj..data est.txt 转成 D:data est.txt)。它会触发 I/O 检查路径有效性,适合用于日志记录、配置校验等需要真实路径的场景。










