FileFilter
public interface FileFilter
- 该接口的实例可以传递给File类的listFiles(FileFilter)方法。
- 实现该接口需要实现接口中的
accept()
方法
accept
boolean accept
测试指定的抽象路径名是否应包含在路径名列表中。
参数
pathname - 要测试的抽象路径名
结果
true if and only if pathname should be included
案例
需求:在指定文件夹中找到所有的".xlsx"文件
思路:遍历文件夹的所有文件,如果有子文件夹,继续遍历子文件夹
代码实现:
测试类
public static void main(String[] args) {
File file = new File("D:\\test");
getAllFile(file);
}
/**
* 遍历文件夹里的内容
* @param file
*/
public static void getAllFile(File file) {
// 将文件夹转成数组类型
File[] files = file.listFiles(new FileFilterImpl());
// 遍历数据
for (File file1 : files) {
/*
判断如果file1是个文件夹,则继续遍历这个文件夹
因为getAllFile()方法就是遍历文件夹的方法 所以直接调用自己就行 这就是递归
*/
if (file1.isDirectory()) {
getAllFile(file1);
/*
如果不是文件夹 打印
*/
} else {
System.out.println(file1);
}
}
}
FileFilter实现类
import java.io.File;
import java.io.FileFilter;
public class FileFilterImpl implements FileFilter {
@Override
public boolean accept(File pathname) {
// 如果是文件夹 直接返回true
if (pathname.isDirectory()) {
return true;
}
return pathname.toString().toLowerCase().endsWith(".xlsx");
}
}
代码解读:
首先必须明确两件事:
- 过滤器中的
accept
方法是谁调用的 -
accept
方法中的pathname
是什么?
带着问题继续往下看
代码难点在于将文件夹转成数组类型这句。listFiles可以将File类型的文件转为File类型的集合,同时又加上了对文件的过滤。代码执行到listFiles
方法的时候,一共做了三件事:
-
listFiles
方法对构造方法中传递的目录进行遍历,获取目录中的每一个文件夹或文件,最后封装成File对象; -
listFiles
方法会调用参数传递的过滤器中的方法accept
; -
listFiles
方法会把遍历得到的每一个File对象传递给accept
方法的参数pathname
。
过滤器的规则:
- 在
accept
方法中,判断File对象是否是以".xlsx"结尾的,是就返回true,不是就返回false - 如果传递进来的File对象是一个文件夹,直接返回true
accept
方法返回的是一个布尔值
true:就会把传递过去的file对象保存到File数组中
false:就不会把传递过去的file对象保存到File数组中
希望本篇文章对您有所帮助,感谢观看!
网友评论