java中常用filefilter或filenamefilter匿名内部类实现文件过滤:filefilter接收file对象,可判断名称、类型等属性;filenamefilter仅接收文件名字符串,适合纯名称匹配;java 8+推荐用lambda替代以提升可读性与维护性。

Java 中用匿名内部类实现简单文件过滤器,最常用的是 FileFilter 或 FilenameFilter 接口,适合一次性、逻辑不复杂的场景,比如只保留 .txt 文件或排除隐藏文件。
用 FileFilter 匿名类过滤后缀名
FileFilter 更推荐,它接收 File 对象,能同时判断名称、类型、属性(如是否为目录):
- 重写
accept(File f)方法,返回 true 表示保留该文件 - 可直接调用
f.getName().endsWith(".log")判断后缀 - 建议加上
f.isFile()避免把目录也误选进来
示例:只列出当前目录下所有 .java 文件
File dir = new File(".");
File[] javaFiles = dir.listFiles(new FileFilter() {
@Override
public boolean accept(File f) {
return f.isFile() && f.getName().toLowerCase().endsWith(".java");
}
});
用 FilenameFilter 匿名类按文件名匹配
FilenameFilter 只传入文件名字符串(不含路径),适合纯名字规则,比如“以 test 开头”或“包含数字”:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 重写
accept(File dir, String name),第二个参数就是文件名 - 注意:第一个
dir参数通常不用,但必须保留签名 - 若需访问完整路径或判断是否为目录,应改用
FileFilter
示例:过滤出名字里有 “2024” 的文件
File[] files = dir.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.contains("2024");
}
});
小技巧:结合 Lambda(Java 8+)更简洁
虽然题目问的是匿名内部类,但顺带提一句:这两个接口都是函数式接口,可用 Lambda 替代,语义更清晰、代码更短:
-
FileFilter→(f) -> f.isFile() && f.getName().endsWith(".md") -
FilenameFilter→(d, n) -> n.startsWith("config") - 实际项目中,只要 JDK ≥ 8,优先选 Lambda,维护性更好
注意事项和常见坑
匿名类写得快,但也容易出错:
- 别忘了
listFiles()返回 null(目录不可读时),要判空再遍历 - 大小写敏感:Windows 不敏感,Linux 敏感,用
toLowerCase()或equalsIgnoreCase()更稳妥 - 隐藏文件(如 Linux 下以
.开头)默认会被包含,如需排除,加!name.startsWith(".")
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










