file类list()返回string[](仅文件名),listfiles()返回file[](含路径对象);二者均通过filenamefilter的accept(file dir, string name)过滤,但list()不递归且仅适用于纯文件名场景,listfiles()更常用因可调用文件属性方法。

Java 中 File 类的 list() 和 listFiles() 方法都支持传入 FilenameFilter 接口实现来过滤文件,但二者返回类型不同:前者返回 String[](仅文件名),后者返回 File[](完整路径对象)。用法核心一致,关键在于正确实现 accept(File dir, String name) 方法。
list() 配合 FilenameFilter 获取文件名数组
适用于只需要文件名、不关心路径或文件属性的场景。注意 dir 参数是当前目录对象,name 是相对该目录的纯文件名(不含路径)。
- 实现
FilenameFilter:重写accept方法,返回true表示保留该文件名 -
list()不会递归,只作用于当前目录下的直接子项 - 如果目录不存在或不可读,返回
null,需判空
示例:列出当前目录下所有以 ".txt" 结尾的文件名
File dir = new File(".");
String[] txtNames = dir.list((file, name) -> name.toLowerCase().endsWith(".txt"));
// 或匿名内部类写法
// String[] txtNames = dir.list(new FilenameFilter() {
// public boolean accept(File dir, String name) {
// return name.toLowerCase().endsWith(".txt");
// }
// });
listFiles() 配合 FilenameFilter 获取 File 对象数组
更常用,因为返回的是 File 对象,可进一步调用 isDirectory()、length()、lastModified() 等方法。
-
listFiles(FilenameFilter)同样只遍历当前目录,不递归 -
accept方法中,file参数是父目录(即调用listFiles()的那个File对象),不是每个子项本身 - 若想基于子项的完整路径或属性过滤,需在
accept中手动构造子项File对象(如new File(file, name))再判断
示例:列出当前目录下所有大于 1KB 的 .log 文件
File dir = new File(".");
File[] largeLogs = dir.listFiles((parent, name) -> {
if (!name.toLowerCase().endsWith(".log")) return false;
File candidate = new File(parent, name);
return candidate.isFile() && candidate.length() > 1024;
});
常见过滤逻辑与注意事项
实际使用中容易忽略几个细节:
-
FilenameFilter只过滤名称,不区分文件/目录 —— 若只想过滤文件,需在accept中显式调用new File(parent, name).isFile() - 大小写敏感:Windows 下文件系统通常不区分大小写,但 Java 字符串比较默认区分,建议统一转小写处理后缀
- 正则匹配更灵活:可用
name.matches(".*\.java$"),但注意.需转义 - 避免空指针:
dir.listFiles(...)在目录为空或无权限时返回null,应先判空再遍历
替代方案:推荐用 Files + Stream(Java 7+)
虽然 FilenameFilter 仍有效,但现代写法更推荐 Files.list() + Stream:
- 支持函数式编程,链式过滤更清晰
- 自动处理异常(用
try-with-resources) - 天然支持递归(配合
Files.walk())
等效示例(获取 .txt 文件):
try (Stream<path> stream = Files.list(Paths.get("."))) {
List<path> txtFiles = stream
.filter(p -> p.toString().toLowerCase().endsWith(".txt"))
.filter(Files::isRegularFile)
.collect(Collectors.toList());
}</path></path>
不复杂但容易忽略细节,按需选择传统 File API 还是 NIO.2 的 Files 工具类。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











