文件过滤器
-
用到file类的方法
File[] listFiles(FileFilter filter) 返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。 File[] listFiles(FilenameFilter filter) 返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。
-
描述
java.io.FileFilter 是一个接口,指的是File的过滤器,该接口的对象可以传递给file类的listFiles(FileFilter filter)作为参数,接口中只有一个方法; 方法: boolean accept(File pathname)测试指定的抽象路径名是否应包含在路径名列表中。如果符合返回true。
-
练习
//使用一个类实现的方式实现 public class Demo2 { public static void main(String[] args) { File file = new File("E:\\code"); searchTxt(file); } //文件搜索 遍历所欲的.txt文件 public static void searchTxt(File dir) { //传入文件过滤器 File[] files = dir.listFiles(new FileFilterImpl()); for (File f : files) { if (f.isDirectory()) {//如果是文件就遍历里面的东西 searchTxt(f);//递归 } else { System.out.println(f);//如果是就打印因为已经过滤掉了 } } } } //定义一个类似实现过滤器的接口重写里面的抽象方法 class FileFilterImpl implements FileFilter { @Override public boolean accept(File pathname) { //如果遍历到了是一个文件夹需要放行 if (pathname.isDirectory()) { return true; }//如果遍历的文件是一个.txt结尾的就为true return pathname.getName().toLowerCase().endsWith(".txt"); } }
//代码优化 public class Demo2Again { public static void main(String[] args) { File file = new File("E:\\code"); method(file); } public static void method(File dir) { //使用内部类的方式实现 /*File[] files = dir.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { if (pathname.isDirectory()) { return true;//判断是否是文件如果是就放行 }//判断是否是.txt文件结尾的 return pathname.getName().toLowerCase().endsWith("txt"); } });*/ //使用Lambda表达式使用 /* File[] files = dir.listFiles((File pathname) -> { return pathname.getName().toLowerCase().endsWith(".txt") || pathname.isDirectory(); });*/ //简化Lambda方式 File[] files = dir.listFiles(pathname -> //如果是文件夹就返回,或者是 .txt结尾的 pathname.getName().toLowerCase().endsWith(".txt") || pathname.isDirectory()); //遍历判断是否是文件夹,或者文件 //文件,就直接输出(因为已经过滤了) //文件夹就直接调用该方法 for (File f : files) { if (f.isDirectory()) { method(f); } else { System.out.println(f); } } } }
-
规则
在accept方法中,判断file类对象是否以.txt结尾。 是就返回true 不是就返回false 如果此file对象是一个文件夹,则返回true,继续遍历这个文件夹
-
FilenameFilter
-
描述
java.io.Filename 接口,实现此接口的类实例可用于过滤器文件。
-
作用:
用于过滤文件名称 抽象方法,用于过滤文件的方法 boolean accept(File dir,String name); 测试指定的文件是否包含在指定的某一个文件列表中。 参数 File dir: 构造方法中传递的被遍历的目录 String name:使用ListFiler方法遍历目录,获取的每一个文件或者文件夹的名称 注意 两个过滤器接口是没有实现类的,需要我们自己定义实现类,重写过滤方法accept,在方法中自己定义过滤规则。
-
代码实例
public class Demo3 { public static void main(String[] args) { File file = new File("E:\\尚硅谷Java全套教程\\1.尚硅谷全套JAVA教程--基础阶段"); method(file); } public static void method(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(".txt"); }; });*/ //使用Lambda表达式的方式表示 /* File[] files = file.listFiles((File dir, String name) -> { return new File(dir, name).isDirectory() || name.toLowerCase().endsWith(".txt"); });*/ //再次优化 File[] files = file.listFiles((dir, name) -> //如果是文件夹就返回 //如果是文件就判断是否是.txt结尾的 new File(dir, name).isDirectory() || name.toLowerCase().endsWith(".txt")); //循环遍历,如果是文件夹就重新调用该方法遍历 for (File f : files) { if (f.isDirectory()) { method(f); } else { System.out.println(f); } } } }
-