java过滤指定后缀文件的核心是使用file类的list()或listfiles()配合filenamefilter/filefilter在列举时筛选,而非读取时判断;推荐初学者用filenamefilter(如name.tolowercase().endswith(".java")),注意后缀带点且统一小写;filefilter更灵活,可结合isfile()等条件;jdk8+建议用files.walk+stream递归查找。

Java 中过滤指定后缀的文件,核心是结合 File 类的 list(FilenameFilter) 或 listFiles(FileFilter) 方法,配合自定义过滤逻辑。关键不在于“读写”,而在于“列举时筛选”——即在获取目录下文件列表阶段就只保留符合后缀条件的项。
用 FilenameFilter 过滤后缀(推荐初学者)
这是最直接、语义清晰的方式,适用于 list() 和 listFiles()。只需实现 accept(File dir, String name) 方法,判断文件名是否以目标后缀结尾:
- 注意大小写:建议统一转为小写再比较,避免
.TXT和.txt被漏掉 - 后缀需带点:比如
".log",不是"log" - 该接口只接收文件名(不含路径),无需解析完整路径
示例:列出所有 .java 文件
File dir = new File("/src/main/java");
FilenameFilter javaFilter = (d, name) -> name.toLowerCase().endsWith(".java");
String[] javaFiles = dir.list(javaFilter); // 返回文件名字符串数组
// 或用 listFiles 得到 File 对象数组
File[] javaFilesObj = dir.listFiles(javaFilter);
用 FileFilter 过滤(更灵活,支持完整 File 对象)
FileFilter 接收的是 File 对象,因此可同时检查名称、类型(是否为文件)、权限、大小等。适合需要多条件组合的场景:
- 用
file.getName()提取文件名再判断后缀,逻辑同上 - 可额外加
file.isFile()避免把子目录也纳入结果 - Lambda 表达式写法简洁:
f -> f.isFile() && f.getName().toLowerCase().endsWith(".xml")
示例:
javaFile[] xmlFiles = dir.listFiles(f ->
f.isFile() && f.getName().toLowerCase().endsWith(".xml")
);
现代写法:Files.walk + Stream(JDK 8+,适合复杂遍历)
如果要递归查找整个目录树中的某类文件(如所有子目录下的 .properties),推荐用 Files.walk 配合流式过滤:
- 自动处理深层嵌套,无需手动递归
- 支持链式操作:过滤 → 映射 → 收集
- 注意捕获
IOException,或用try-with-resources确保资源释放
示例:
javatry (Stream<path> stream = Files.walk(Paths.get("/config"))) {
List<path> props = stream
.filter(p -> p.toString().toLowerCase().endsWith(".properties"))
.filter(Files::isRegularFile)
.collect(Collectors.toList());
} catch (IOException e) {
e.printStackTrace();
}
</path></path>
常见误区提醒
别把过滤逻辑写在读取环节(如逐个打开再判断后缀),那样效率低且易出错。真正的过滤应在「获取文件列表」这一步完成。另外:File.list() 只返回文件名,File.listFiles() 才返回可直接用于后续读写的 File 对象——按需选择。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











