在File类中有两个和listFiles重载的方法,方法的参数传递的就是过滤器:
-
File[] listFiles(FileFilter filter)
作用:用来过滤文件(File对象)
参数:File pathname:使用listFile方法遍历目录,得到的每一个文件对象 -
File[] listFiles(FilenameFilter filter)
作用:用于过滤文件名称
参数:File dir:构造方法中传递的被遍历目录
String name:使用listFile方法遍历目录,获得每一个文件或文件夹的名称
注意:两个过滤器接口是没有实现类的,需要我们自行写实现类,然后accept()方法重写过滤规则。
接下来我们通过一个小案例实现文件过滤功能:
需求:给定一个文件目录,查找出以.java结尾的文件
首先我们先使用第一个过滤方法File[] listFiles(FileFilter filter)来实现此功能
public class test {
public static void main(String[] args) {
File file = new File("C:\\Users\\lenovo\\Desktop\\java笔记");
getAllFile(file);
}
private static void getAllFile(File file) {
//传递过滤对象
File[] files = file.listFiles(new FileFilter(){
/**
* 实现FileFilter接口中的accept方法,重写过滤规则
* @param pathname
* @return
*/
@Override
public boolean accept(File pathname) {
return pathname.isDirectory() || pathname.getPath().toLowerCase().endsWith(".java");
}
});
for(File filename :files){
if(filename.isDirectory()){
getAllFile(filename);
}else{
System.out.println(filename);
}
}
}
}
接下来我们来分析一下这个过滤器实现的原理,主要分为以下几步:
- listFiles方法会对构造器传递过来的目录进行遍历,获取每一个文件或文件夹,然后封装为File对象
- listFiles方法会调用参数传递的过滤器中的accept()方法
- listFiles方法将遍历得到的每一个File对象,传递给accept()方法中的参数pathname
- accept()方法接收到pathname的值后,根据用户自行重写的过滤规则,然后进行过滤,当符合过滤规则时,返回true,并把传递过来的File对象保存到File数组中;若不符合过滤规则,则返回false,不会把传递过来的File对象保存到File数组中
第二种实现方式:
public class test {
public static void main(String[] args) {
File file = new File("C:\\Users\\lenovo\\Desktop\\java笔记");
getAllFile(file);
}
private static void getAllFile(File file) {
//传递过滤对象
File[] files = file.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return new File(dir,name).isDirectory() || name.toLowerCase().endsWith(".java");
}
});
for(File filename :files){
if(filename.isDirectory()){
getAllFile(filename);
}else{
System.out.println(filename);
}
}
}
}
两种方式实现原理差不多,所以不再重复说啦~~