练习:
遍历打印多级目录,遍历C:abc文件夹,即abc文件夹的子文件夹,只要.java结尾的文件
C:\abc
C:\abc\a
C:\abc\a\a.java
C:\abc\a\a.txt
C:\abc\abc.java
C:\abc\abc.txt
C:\abc\b
C:\abc\b\b.java
C:\abc\b\b.txt
package demo26file过滤器匿名内部类;
/*
练习:
遍历打印多级目录,遍历C:abc文件夹,即abc文件夹的子文件夹,只要.java结尾的文件
C:\abc
C:\abc\a
C:\abc\a\a.java
C:\abc\a\a.txt
C:\abc\abc.java
C:\abc\abc.txt
C:\abc\b
C:\abc\b\b.java
C:\abc\b\b.txt
我们可以使用过滤器来实现优化:
在File类中有两个和listFiles重载的方法,方法参数传递的就是过滤器
File[] listFiles(FileFilter filter) java.io.FileFilter接口:用于抽象路径名(File对象)的过滤器
作用:用于过滤文件(File对象)
抽象方法:用于过文件的方法 boolean accept(File pathname) 测试指定抽象路径名是否应该包含在某个路径列表中
参数:File pathname:使用ListFiles方法遍历目录,得到的每一个文件对象
File[] listFiles(FilenameFilter filter) java.io.FilenameFilter接口;实现此接口的类实例可用于过滤文件名
作用:用于过滤抽象名称
抽象方法:用于过滤抽象文件的方法 boolean accept(File dir,String name) 测试指定文件夹是否应该包含在某一文件列表中
参数:File dir:构造方法中传递的被遍历的目录
String name:使用listFiles方法遍历的目录,获取的每一个文件或文件夹的名称
注意:两个过滤器接口是没有实现类的,需要我们写实现类,重写过滤的规则
*/
import demo25file过滤器.FileFiletermpl;
import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
public class DemoRecurison {
public static void main(String[] args) {
File file=new File("C:\\abc");
getAllFile(file);
}
private static void getAllFile(File dir){
//System.out.println(dir);//打印被遍历的目录名称
/* File[] files=dir.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
//过滤规则,pathname是文件,或者是.java结尾的文件返回true
return pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java");
}
});//传递过滤起对象
//使用Lamdba表达式优化匿名内部类
File[] file=dir.listFiles((File pathname)->{
//过滤规则,pathname是文件,或者是.java结尾的文件返回true
return pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java");
});*/
/*
listFiles方法一共做了3件事情:
1.listFiles方法会对构造方法中传递的目录进行遍历,获取目录中的每一个文件/文件夹--封装为File对象
2.listFiles方法会调用参数传递的过滤器中的accept方法
3.listFiles方法会把遍历得到的每一个File对象,传递给accept方法的参数pathname
accept方法返回一个布尔值,true就会把传递过去的对象(文件夹、.java结尾的文件)保存到Files数组中 false就不会把传递过去的File对象保存到数组中
*/
/* File[] files=dir.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
//过滤规则,pathname是文件,或者是.java结尾的文件返回true
return new File(dir,name).isDirectory() || name.toLowerCase().endsWith(".java");
// File(dir,name).isDirectory()根据目录组合成文件对象
}
});*/
//使用Lamdba表达式优化匿名内部类(接口中只有一个抽象方法)
File[] file=dir.listFiles((File d, String name)->{
return new File(d,name).isDirectory() || name.toLowerCase().endsWith(".java");
// File(dir,name).isDirectory()根据目录组合成文件对象
});
for (File f:file){
if (f.isDirectory()){//f是一个文件夹,则遍历整个文件夹
getAllFile(f);//递归调用自身
}else{
System.out.println(f);
}
}
}
}
结果: