FileFilter过滤器
如打印多级目录下所有以.java结尾的文件,常规递归做法:
/* 练习:递归打印多级目录 需求:遍历D:\\a文件及,及a文件夹下的子文件夹 只要.java结尾的文件 */ public class Demo13FileFilter { public static void main(String[] args) { File dir = new File("D:\\a"); getAllFile(dir); } /* 定义一个方法,参数传递File类型的目录 */ public static void getAllFile(File dir){ File[] files = dir.listFiles(); for (File file : files) { if(file.toString().endsWith(".java")) { System.out.println(file); } if(file.isDirectory()){ getAllFile(file); } } } }
在File类中有两个和ListFiles重载的方法,方法传递的参数就是过滤器。
File[] | listFiles() 返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 |
File[] | listFiles(FileFilter filter) 返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。 |
File[] |
|
FileFilter接口
java.io.FileFilter是用于抽象路径名(就是File对象)的过滤器。
作用:过滤文件(File对象)的。
抽象方法:
boolean | accept(File pathname) 测试指定抽象路径名是否应该包含在某个路径名列表中。 |
参数:pathname:使用ListFiles方法遍历目录,得到的每一个文件对象。
FilenameFilter接口
实现java.io.FilenameFilter接口的类实例可以用于过来文件名。
作用:过滤文件(File对象)名称的。
抽象方法:
boolean | accept(File dir, String name) 测试指定文件是否应该包含在某一文件列表中。 |
参数:dir:构造方法中传递的被遍历的目录;name:使用ListFiles方法遍历目录,获取的每一个文件/文件夹的名称
注意事项:
两个过滤器接口没有实现类的,需要自己写实现类,重写过滤的方法accept,在方法中自己定义过滤规则。
FileFilter过滤器原理:
代码实现:
/* 创建过滤器FileFilter的实现类,重写过滤方法accept,定义过滤规则 */ public class FileFilterImpl implements FileFilter { @Override public boolean accept(File pathname) { // pathname:使用ListFiles方法遍历目录,得到的每一个文件对象。 if(pathname.toString().endsWith(".java") || pathname.isDirectory()) return true; else return false; } }
public static void main(String[] args) { File dir = new File("D:\\a"); getAllFile(dir); } /* 定义一个方法,参数传递File类型的目录 */ public static void getAllFile(File dir){ File[] files = dir.listFiles(new FileFilterImpl()); // 传递过滤器对象 for (File file : files) { // if(file.toString().endsWith(".java")) { System.out.println(file); // } if(file.isDirectory()){ getAllFile(file); } } } }
优化1--匿名内部类:
public static void main(String[] args) { File dir = new File("D:\\a"); getAllFile(dir); } /* 定义一个方法,参数传递File类型的目录 */ public static void getAllFile(File dir){ File[] files = dir.listFiles(new FileFilter(){ @Override public boolean accept(File pathname) { if(pathname.toString().endsWith(".java") || pathname.isDirectory()) return true; else return false; } }); // 传递过滤器对象 for (File file : files) { // if(file.toString().endsWith(".java")) { System.out.println(file); // } if(file.isDirectory()){ getAllFile(file); } } }
优化2--Lambda表达式 前提:只有一个抽象方法。
public static void main(String[] args) { File dir = new File("D:\\a"); getAllFile(dir); } /* 定义一个方法,参数传递File类型的目录 */ public static void getAllFile(File dir){ File[] files = dir.listFiles((File pathname)-> { if(pathname.toString().endsWith(".java") || pathname.isDirectory()) return true; else return false; }); // 传递过滤器对象 for (File file : files) { // if(file.toString().endsWith(".java")) { System.out.println(file); // } if(file.isDirectory()){ getAllFile(file); } } }