FilenameFilter和FileFilter接口都是用于文件的筛选。但是方法的参数有所不同:
FilenameFilter 接口:boolean accept(File dir,String name); 其中dir为当前目录,name是文件名。
FileFilter接口:boolean accept(File pathname);pathname则为文件
到此我们只能看出他们参数的不一致。为了进一步了解,我们看一下他们执行时的情况。
通常我们会用下面三个函数进行使用文件过滤器。
public String[] list(FilenameFilter filter); // 返回的是符合要求的文件名称,以字符串数组返回
public File[] listFiles(FilenameFilter filter); // 返回的是符合要求的文件,以文件类型返回
public File[] listFiles(FileFilter filter); // 返回的是符合要求的文件,以文件类型返回
其中,list方法由于返回字符串形式,所以,只支持FilenameFilter参数。当我们只需要文件名,并不需要对文件进行操作时,选择list方法简单高效。
重点比较listFiles(FilenameFilter filter)和listFiles(FileFilter filter)。从返回结果和功能上,它们并没有什么区别,都是选取符合某种条件的File类型数据。
我们看一下具体回调过程:
/** 返回当前目录下 符合文件过滤器 filter.accept(File dir,String name)的文件名称 */
public String[] list(FilenameFilter filter) {
String names[] = list();
if ((names == null) || (filter == null)) {
return names;
}
List<String> v = new ArrayList<>();
for (int i = 0 ; i < names.length ; i++) {
if (filter.accept(this, names[i])) {
v.add(names[i]);
}
}
return v.toArray(new String[v.size()]);
}
/** 返回当前目录下 符合文件过滤器 filter.accept(File dir,String name)的文件数组 */
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)); // 字符串匹配成功了,再新建file
return files.toArray(new File[files.size()]);
}
/** 返回当前目录下 符合文件过滤器 FileFilter filter.accept(File name)的文件数组 */
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)是先用字符串匹配,匹配成功后创建File对象。
而listFiles(FileFilter filter),则不同,直接先创建File对象,后使用File对象进行匹配。
所以。不对文件进行操作,只筛选的话从效率上说,listFiles(FilenameFilter filter)是更快的。
如果需要对文件进行操作,则listFiles(FileFilter filter)更加方便。
应用:
import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.util.regex.Pattern;
public class FileExp {
public static void printf(Object[] obj){
for(Object o : obj){
System.out.println(o.toString());
}
}
public static void main(String[] args){
File path = new File("E:\\intellij");
printf(path.list());
printf(path.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
Pattern pattern = Pattern.compile("pythonCode");
return pattern.matcher(name).matches();
}
}));
printf(path.listFiles(new FileFilter(){
@Override
public boolean accept(File pathname) {
Pattern pattern = Pattern.compile("pythonCode");
return pattern.matcher(pathname.getName()).matches();
}
}));
printf(path.listFiles((dir,name)->{
Pattern pattern = Pattern.compile("pythonCode");
return pattern.matcher(name).matches();
}));
}
}
运行结果
a.txt
advanced
alg
exp
jedis-master
pythonCode
source
spark-2.3.1-rc4
E:\intellij\pythonCode
E:\intellij\pythonCode
E:\intellij\pythonCode