Java过滤特定后缀文件核心是用File.listFiles()配合FilenameFilter或FileFilter,须预检isDirectory()和canRead()避免null;FilenameFilter仅匹配文件名、轻量高效,FileFilter可判断文件属性;推荐用Set管理多后缀,现代项目优先选用Files.walk+Predicate替代。

Java 中过滤特定后缀文件,核心是用 File.listFiles() 配合过滤器接口,但必须注意预检和写法细节,否则容易返回 null 或漏匹配。
用 FilenameFilter 筛选(轻量、只看文件名)
这是最常用的方式,适合简单后缀匹配:
- 实现
FilenameFilter接口,重写accept(File dir, String name) -
name是纯文件名(不含路径),直接对它做后缀判断,比如:return name.toLowerCase().endsWith(".txt"); - 别在
accept里 new File、调isFile()或 IO 操作——这会引发额外磁盘访问或 NPE - 传入
listFiles()前,先检查:if (dir.isDirectory() && dir.canRead()) { ... },避免静默返回null
用 FileFilter 筛选(可判断文件属性)
如果需要结合文件类型(比如只取普通文件、排除目录),用 FileFilter 更合适:
- 实现
accept(File pathname)方法 - 先判断
pathname.isFile(),再判断扩展名:return pathname.isFile() && pathname.getName().toLowerCase().endsWith(".log"); - 注意:该方式性能略低于
FilenameFilter,因为每次都要构造File对象
支持多个后缀的写法(推荐用 Set)
硬编码 if-else 不易维护,建议用不可变集合:
立即学习“Java免费学习笔记(深入)”;
- 定义:
Set<String> exts = Set.of(".jpg", ".png", ".gif"); - 在
accept中:
int dot = name.lastIndexOf(".");<br> String suffix = dot > 0 ? name.substring(dot).toLowerCase() : "";<br> return exts.contains(suffix); - 这样能安全处理无点文件名、隐藏文件(如
.gitignore)等边界情况
更现代的替代方案:Files.walk + Predicate
File.listFiles 是旧 API,不支持深度遍历、符号链接控制,且大目录易 OOM。推荐用 NIO.2:
- 用
Files.walk(dir)得到Stream<Path> - 过滤时用:
.filter(p -> Files.isRegularFile(p))<br> .filter(p -> p.getFileName().toString().toLowerCase().endsWith(".xml")) - 优势:自动跳过不可读目录、可控制遍历深度、支持异常处理(如
IOException)、流式内存友好


















