使用file.list配合filenamefilter可筛选指定后缀文件,需正确实现accept方法判断文件名结尾(注意大小写和隐藏文件);推荐用files.walk+stream替代以支持递归和更灵活过滤。

<p>使用 <code>File.list</code> 配合 <code>FilenameFilter</code> 可以筛选出指定后缀的文件,关键在于正确实现 <code>accept</code> 方法,判断文件名是否以目标后缀结尾(注意区分大小写和隐藏文件)。</p>
<h3>基本用法:创建 FilenameFilter 匿名类</h3>
<p>最常用的方式是传入一个匿名内部类,重写 <code>accept</code> 方法:</p>
<p><font color="gray">// 假设只想要 .txt 文件</font></p>
<pre class="brush:php;toolbar:false;"><code>File dir = new File("/path/to/directory");
String[] txtFiles = dir.list((dirFile, name) -> {
return name.toLowerCase().endsWith(".txt");
});</code>
这里用了 Lambda 表达式(Java 8+),等价于传统匿名类写法。注意:name 是纯文件名(不含路径),不包含父目录信息。
处理大小写敏感问题
文件系统行为因平台而异(Windows 不区分大小写,Linux 区分),建议统一转小写或大写再比较:
- 若希望匹配
.TXT、.txt、.Txt等所有变体,统一用toLowerCase() - 若严格要求小写后缀(如仅
.txt),直接用name.endsWith(".txt") - 避免用
name.substring(name.lastIndexOf('.'))提取扩展名——可能出错(如文件名含多个点或无点)
排除目录,只保留普通文件
FilenameFilter 只过滤文件名,不区分文件/目录。如果只想返回“带指定后缀的普通文件”,需额外检查:
<code>File dir = new File("/path/to/directory");
String[] filtered = dir.list((d, name) -> {
File f = new File(d, name);
return f.isFile() && name.toLowerCase().endsWith(".log");
});</code>
注意:必须用 new File(d, name) 构造完整路径再调用 isFile(),不能只靠文件名判断。
更推荐:用 Files.walk + Stream(Java 8+)
相比 File.list,NIO.2 的方式更灵活、可读性更好,且天然支持递归、属性判断:
<code>try (Stream<Path> stream = Files.walk(Paths.get("/path/to/directory"))
.filter(Files::isRegularFile)
.filter(p -> p.toString().toLowerCase().endsWith(".json"))) {
List<String> jsonNames = stream.map(p -> p.getFileName().toString())
.collect(Collectors.toList());
}</code>
它自动跳过目录、符号链接,并支持链式过滤,适合复杂场景;但若只需当前目录且追求轻量,File.list 仍够用。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











