File类listFiles()仅返回指定目录的直接子项且可能为null,需先判断isDirectory()再判空遍历;可用isFile()/isDirectory()区分类型;替代方案包括list()和listFiles(FileFilter);推荐NIO.2的Files.walk()实现递归。

Java 中 File 类可以通过 listFiles() 方法获取指定目录下的所有文件和子目录,但要注意它只返回**直接子项**,不递归;且返回结果可能为 null(如路径不存在、非目录或无读取权限)。
使用 listFiles() 获取直接子项
listFiles() 返回 File[] 数组,每个元素代表一个文件或子目录。需先确认目标路径是有效目录,再调用:
- 创建
File对象时传入合法路径字符串(支持相对或绝对路径) - 调用
isDirectory()判断是否为目录,避免对文件调用导致返回null - 检查返回数组是否为
null,再遍历打印或处理
示例代码:
File dir = new File("/path/to/directory");
if (dir.isDirectory()) {
File[] entries = dir.listFiles();
if (entries != null) {
for (File entry : entries) {
System.out.println(entry.getName() +
(entry.isDirectory() ? " [dir]" : " [file]"));
}
} else {
System.out.println("无法读取该目录(权限不足或IO异常)");
}
} else {
System.out.println("不是有效目录");
}
区分文件与子目录
遍历 listFiles() 返回的数组时,用 isFile() 和 isDirectory() 可明确判断类型:
立即学习“Java免费学习笔记(深入)”;
-
entry.isFile()→ 普通文件(含隐藏文件) -
entry.isDirectory()→ 子目录 - 两者都为
false的情况极少(如符号链接失效、特殊设备文件),一般可忽略或按“未知”处理
替代方案:list() 与 list(FilenameFilter)
如果只需要文件名字符串(而非 File 对象),可用 list();若要过滤,可传入 FilenameFilter 或 FileFilter:
-
list()返回String[],轻量但无法直接获取类型或路径信息 -
listFiles(FileFilter)支持更灵活的筛选逻辑(例如只保留以 ".txt" 结尾的文件) - 注意:过滤器在遍历时逐个应用,不影响原始目录结构
注意点与常见问题
File 类已属传统 IO,部分行为受操作系统限制:
- 路径分隔符建议用
File.separator(而非硬写 "/" 或 "\") - 中文路径或特殊字符在某些 JDK 版本/系统下可能出错,推荐搭配
Paths.get()+Files类(NIO.2) -
listFiles()不抛出异常,失败时静默返回null,务必判空 - 若需递归列出全部子孙项,需自行实现遍历逻辑或改用
Files.walk()


















