情景
这里有一个文件夹‘searchFile1’,文件夹下面有如下文件:
现在我们要使用FilenameFilter过滤器将.txt文件名全部输出。
代码
下面这段代码是比较容易写出来的,也是网上搜索后主流写法,运行下:
/**
* FilenameFilter筛选
* @param filePath
*/
public void findTxt(String filePath){
File file = new File(filePath);
File[] files = file.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".txt");
}
});
for (File file2 : files) {
System.out.println(file2.getName());
}
}
输出:
a.txt
b.txt
c.txt
d.txt
file.txt
问题来了,file.txt 是谁!很明显他不是.txt文件。你可能会想,谁会那么傻,在文件夹命名时加上.txt , 万事皆有可能!主要还是严谨 。
修正参考
这里需要简单处理下:加上isFile()这个判断。
/**
* FilenameFilter筛选
* @param filePath
*/
public void findTxt(String filePath){
File file = new File(filePath);
File[] files = file.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
String dirAbsolutePath = dir.getAbsolutePath();
String targetFilePath = dirAbsolutePath+"\\"+name;
File newFile = new File(targetFilePath);
return (name.endsWith(".txt") && newFile.isFile());
}
});
for (File file2 : files) {
System.out.println(file2.getName());
}
}
运行下:
a.txt
b.txt
c.txt
d.txt
这下放心了!
总结
实际中使用FileFilter可以减少路径处理和File实例化过程,但针对当前需求,也是要加上isFile()的判断。FileFilter就不赘述!