文件过滤器简介
@FunctionalInterface
public interface FilenameFilter {
boolean accept(File dir, String name);
}
@FunctionalInterface
public interface FileFilter {
boolean accept(File pathname);
}
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类型数据。
我们看一下具体回调过程:
一般地,使用list()和list Files()返回所有文件和目录:
String[] list()
返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。
File[] listFiles()
返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
FilenameFilter 和 FileFilter用来把符合要求的文件或目录返回。
String[] list(FilenameFilter filter)
返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。
File[] listFiles(FilenameFilter filter)
返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。
File[] listFiles(FileFilter filter)
返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。
方法详细信息
1、FilenameFilter接口:boolean accept(File dir, String name) 测试指定文件是否应该包含在某一文件列表中。
参数:dir- 被找到的文件所在的目录。name- 文件的名称。
返回:当且仅当该名称应该包含在文件列表中时返回true;否则返回false。
2、FileFilter接口:boolean accept(File pathname) 测试指定抽象路径名是否应该包含在某个路径名列表中。
参数:pathname- 要测试的抽象路径名
返回:当且仅当应该包含pathname 时返回 true
两者的区别
FilenameFilter中的accept函数接收的是两个参数:指定父目录的路径和父目录路径中所有的子文件或者子文件夹,需要将这两个参数封装成File的对象再使用File中的功能。
FileFilter中的accept函数接收的则直接是:完整的路径,即需要进行过滤操作的文件或文件夹,直接可以使用File中的功能。
程序实例
public class FileFilterTest1 {
public static void main(String[] args) {
File file = new File("D:\\java");
// 列出目录下的所有文件和文件夹
String[] files = file.list();
for(int i = 0; i < files.length; i++) {
System.out.println(files[i]);
}
// 分别用FilenameFilter 和 FileFilter 实现过滤以.txt为后缀的文件
String[] files1 = file.list(new MyFilenameFilter(".txt"));
for(int i = 0; i < files1.length; i++) {
System.out.println(files1[i]);
}
System.out.println("======================================");
// MyFileFilter过滤器用于 listFiles 函数
File[] files2 = file.listFiles(new MyFileFilter(".txt"));
for(int i = 0; i < files2.length; i++) {
System.out.println(files2[i].getName());
}
}
}
class MyFilenameFilter implements FilenameFilter {
// type为需要过滤的条件,比如如果type=".jpg",则只能返回后缀为jpg的文件
private String type;
public MyFilenameFilter(String type) {
this.type = type;
}
// 返回true的文件则合格
public boolean accept(File dir, String name) {
// 这里如果需要使用文件的功能,则需要先进行封装
File file = new File(dir,name);
return name.endsWith(type) && file.isFile();
}
}
class MyFileFilter implements FileFilter {
private String type;
public MyFileFilter(String type) {
this.type = type;
}
public boolean accept(File pathname) {
// 这里如果需要使用文件的功能直接使用即可
return pathname.getName().endsWith(type) && pathname.isFile();
}
}
参考:
FilenameFilter和FileFilter文件过滤器
Java - FilenameFilter和FileFilter的区别