FileFilter和FilenameFilter
这两个接口在名称上就可以看的出来,是文件过滤器,只不过这两个接口在方法参数上有所不同。
先来看方法的区别
FileFilter接口:
boolean accept(File pathname); pathname 要测试的抽象路径名
测试指定的抽象路径名是否应包含在路径名列表中。
FilenameFilter接口:
boolean accept(File dir, String name); dir:当前目录,name:文件名
测试指定文件是否应包含在文件列表中。
那么,何时才会用到他们呢?现在我们来看File类的三个方法。
public String[] list(FilenameFilter filter) {}
public File[] listFiles(FilenameFilter filter){}
public File[] listFiles(FileFilter filter) {}
这三个方法都能对文件进行过滤,但是返回值上会有不同,如果您只是想文件名,而不对文件进行操作,那么采用
list(FilenameFilter filter)方法会更加高效。
下面只要来对比一下 listFiles 这两个方法
先看源码:
public File[] listFiles(FilenameFilter filter) {
String ss[] = list();
if (ss == null) return null;
ArrayList<File> files = new ArrayList<>();
//先过滤,后创建
for (String s : ss)
if ((filter == null) || filter.accept(this, s))
files.add(new File(s, this));
return files.toArray(new File[files.size()]);
}
public File[] listFiles(FileFilter filter) {
String ss[] = list();
if (ss == null) return null;
ArrayList<File> files = new ArrayList<>();
for (String s : ss) {
//先创建,后过滤
File f = new File(s, this);
if ((filter == null) || filter.accept(f))
files.add(f);
}
return files.toArray(new File[files.size()]);
}
从上面我们可以看出,listFiles(FilenameFilter filter)是先找到符合的文件名,然后再创建文件,
而 listFiles(FileFilter filter) 则是先创建文件,再进行比对。
所以,如果只对文件进行筛选的话,listFiles(FilenameFilter filter) 肯定是效率高的,
如果需要对文件进行一些操作,listFiles(FileFilter filter) 则会方便许多。
下面写一个测试
-
编写MyFileFilter和MyFileNameFilter
public class MyFileFilter implements FileFilter { /** * 文件后缀名,比如 .jpg .txt 等 */ private String type; public MyFileFilter(String type) { this.type = type; } @Override public boolean accept(File pathname) { return pathname.getName().endsWith(type); }
public class MyFileNameFilter implements FilenameFilter { /** * 文件类型,比如以txt、mp3 结尾的 */ private String type; public MyFileNameFilter(String type) { this.type = type; } @Override public boolean accept(File dir, String name) { return name.endsWith(type); } }
-
编写测试类
public class Test { public static void main(String[] args){ File file = new File("d:/"); String[] list = file.list(new MyFileNameFilter(".md")); for (String s : list){ System.out.println(s); } System.out.println("\nFileNameFilter: "); File[] files = file.listFiles(new MyFileNameFilter(".md")); for (File f : files){ System.out.println(f.getName()); } System.out.println("\nFileFilter: "); File[] files1 = file.listFiles(new MyFileFilter(".md")); for (File f : files1){ System.out.println(f.getName()); } } }
-
输出结果:
FilenameFilter.md informatic.md mdeiawiki.md 微信公众号搭建.md 数据准备.md 遇到的问题.md FileNameFilter: FilenameFilter.md informatic.md mdeiawiki.md 微信公众号搭建.md 数据准备.md 遇到的问题.md FileFilter: FilenameFilter.md informatic.md mdeiawiki.md 微信公众号搭建.md 数据准备.md 遇到的问题.md