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 不易维护,建议用不可变集合:
- 定义:
Set<string> exts = Set.of(".jpg", ".png", ".gif");</string> - 在
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></path> - 过滤时用:
.filter(p -> Files.isRegularFile(p))<br> .filter(p -> p.getFileName().toString().toLowerCase().endsWith(".xml")) - 优势:自动跳过不可读目录、可控制遍历深度、支持异常处理(如
IOException)、流式内存友好
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











