java筛选文件核心靠filefilter和filenamefilter接口配合listfiles()使用:filefilter基于完整file对象判断,可访问目录、大小、时间等属性;filenamefilter仅基于文件名字符串匹配,性能更高但不自动处理子目录。

Java 中筛选特定文件,核心是让 File 对象在遍历时只保留符合条件的条目,关键靠 FileFilter 和 FilenameFilter 两个接口配合 listFiles() 方法使用。它们不提供现成实现,必须自己写逻辑,但用法清晰、控制灵活。
FileFilter:基于完整 File 对象做判断
FileFilter 的 accept(File pathname) 方法接收一个 File 实例,因此你能访问它的全部属性——是否是目录、文件名、大小、最后修改时间等。适合需要综合判断的场景。
- 常用写法是先用
pathname.isDirectory()允许子目录递归进入,再用pathname.getName().toLowerCase().endsWith(".zip")匹配后缀 - 可结合
pathname.length() > 1024或pathname.lastModified() > timestamp做大小或时间过滤 - Lambda 表达式写法简洁:
dir.listFiles(f -> f.isFile() && f.getName().endsWith(".log"))
FilenameFilter:只关心文件名字符串
FilenameFilter 的 accept(File dir, String name) 只给目录路径和纯文件名(不含路径),性能略高,因为不创建每个文件的 File 对象。适合单纯按名称规则筛选。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 参数中的
name是原始字符串,比如"report.pdf",直接用name.endsWith(".pdf")即可 - 注意它不会自动跳过目录,如果想包含子目录,需额外在调用方处理(
listFiles()返回的仍是File[],需自行判断并递归) - 常见用法:
dir.listFiles((d, n) -> n.toLowerCase().matches("data_\d{8}\.csv"))匹配日期格式 CSV 文件
实际使用时的关键细节
两个接口都依赖 File.listFiles(Filter) 触发,该方法内部会遍历目录、对每个条目调用 accept,返回 true 的才进结果数组。返回 false 的条目会被直接忽略,不参与后续处理。
- 务必检查
listFiles()返回值是否为null(目录不存在或无读取权限时发生) - 若要递归搜索整个目录树,需在
accept中返回true给目录,并在循环中对每个File判断isDirectory()后再次调用listFiles - 后缀匹配建议统一转小写,避免
.ZIP、.Zip漏判:name.toLowerCase().endsWith(".txt")
选哪个?看需求重心
如果只按扩展名、前缀或正则匹配文件名,FilenameFilter 更轻量;如果还要依据文件大小、权限、修改时间或完整路径结构判断,必须用 FileFilter。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










