File类与IO流——第三节 过滤器
3.1 FileFilter过滤器的原理和使用
对文件搜索优化
明白两件事情:
过滤器中的accept 是谁调用的
accept 方法的参数pathname 是什么
listFiles方法一共做了3件事情:
1、对构造方法中传递的目录进行遍历,获取目录中的每一个文件(夹), 被封装成File对象
2、listFiles方法会调用参数传递的过滤器中的方法accept
3、listFiles会把遍历得到的每一个File对象传递给accept 方法的参数pathname。返回一个true
accept 方法返回值是一个boolean.若返回true 会把传递过去的File对象保存到file数组中,返回false不会保存到数组中
过滤的规则: accept 中判断File 对象是否以.xmind结尾,是返回true ,不是返回false
package com.company.demo02.Recursion;import com.company.demo03Filter.FileFilterImp;import java.io.File;/** * @author 杜艳艳 * @version 1.0 * @date 2020/12/24 16:49 * 只要.xmind结尾的文件。可以用过滤器来实现,。在File 类中有两个和listFiles重载的方法, 方法的参数传递的就是过滤器 * 1、java.io 包下的 public interface FileFilter:抽象路径名(File对象)的过滤器。 * 作用:用来过滤文件。File 对象 * 有个抽象方法 boolean = accept(File pathname),用来过滤文件的方法 * 参数:File pathname :使用listFiles方法遍历目录,得到的每一个文件对象 * * 2、java.io 包下的 public interface FilenameFilter,文件名称过滤器 * 实现此接口的类的实例用于过滤文件名。 这些实例用于过滤类File的list方法中的目录列表,以及Abstract Window Toolkit的文件对话框组件。 * 有个抽象方法 boolean accept(File dir, String name) * dir - 构造方法中传递的遍历的/找到该文件的目录。 * name - 使用listFiles方法遍历目录获取的每一个文件/夹的名称。 * 结果 * true当且仅当名称应包含在文件列表中时; 否则为false 。 * 注意: * 两个过滤器接口,没有实现类,需要自己写实现类,重写过滤的方法accept。 在方法中自己定义过滤的规则 */public class Demo06Recursion { public static void main(String[] args) { File file = new File("D:\\工作信息\\数仓"); getAllFile(file); } /*定义一个方法,参数传递file 类型的目录 方法对目录遍历 */ public static void getAllFile(File dir){ File[] file = dir.listFiles(new FileFilterImp()); //传递过滤器对象 /* 过滤器的原理 listFiles一共做了3件事情: 1、对构造方法中传递的目录进行遍历,获取目录中的每一个文件/夹, 被封装成File对象 2、listFiles方法会调用参数传递的过滤器中的方法accept 3、listFiles会把遍历得到的每一个File对象传递给accept方法的参数pathname。返回一个true accept方法返回值是一个boolean.返回true 会把传递过去的File对象保存到file数组中,返回false不会保存到数组中 过滤的规则: accept中判断对象file 对象是否以xmind结尾,是返回true ,不是返回false */ /* 解决办法: 需要对遍历到的file1是否是文件夹,如果是文件夹,则继续遍历则文件夹file1 。 调用getAllFile()即可。 如果是文件,直接打印即可。 */ for (File file1 : file) { if (file1.isDirectory()){ getAllFile(file1); } else{ //file1是一个文件,直接打印即可 System.out.println(file1); } } }}
package com.company.demo03Filter;import java.io.File;import java.io.FileFilter;/** * @author 杜艳艳 * @version 1.0 * @date 2020/12/24 17:09 * 创建过滤器FileFilter的实现类,重写过滤方法accept .定义过滤规则 */public class FileFilterImp implements FileFilter { @Override public boolean accept(File pathname) { /* 过滤的规则: accept中判断对象file 对象是否以xmind结尾,是返回true ,不是返回false */ //如果pathname 是文件夹,返回true继续遍历文件夹。 返回true ,把文件夹放到数组里。 if (pathname.isDirectory()){ return true; } return pathname.getName().toLowerCase().endsWith(".xmind"); // return true; // 所有的文件都有 //return false; 所有的文件都没 }}
3.2FilenameFilter过滤器的使用
package com.company.demo03Filter;import java.io.File;import java.io.FileFilter;import java.io.FilenameFilter;/** * @author 杜艳艳 * @version 1.0 * @date 2020/12/24 16:49 * 只要.xmind结尾的文件。可以用过滤器来实现,。在File 类中有两个和listFiles重载的方法, 方法的参数传递的就是过滤器 * 1、java.io 包下的 public interface FileFilter:抽象路径名(File对象)的过滤器。 * 作用:用来过滤文件。File 对象 * 有个抽象方法 boolean = accept(File pathname),用来过滤文件的方法 * 参数:File pathname :使用listFiles方法遍历目录,得到的每一个文件对象 * * 2、java.io 包下的 public interface FilenameFilter,文件名称过滤器 * 实现此接口的类的实例用于过滤文件名。 这些实例用于过滤类File的list方法中的目录列表,以及Abstract Window Toolkit的文件对话框组件。 * 有个抽象方法 boolean accept(File dir, String name) * dir - 构造方法中传递的遍历的/找到该文件的目录。 * name - 使用listFiles方法遍历目录获取的每一个文件/夹的名称。 * 结果 * true当且仅当名称应包含在文件列表中时; 否则为false 。 * 注意: * 两个过滤器接口,没有实现类,需要自己写实现类,重写过滤的方法accept。 在方法中自己定义过滤的规则 */public class Demo06Recursion2 { public static void main(String[] args) { File file = new File("D:\\工作信息\\数仓"); getAllFile(file); } /*定义一个方法,参数传递file 类型的目录 方法对目录遍历 */ public static void getAllFile(File dir){ //传递过滤器对象,使用匿名内部类 /* File[] file = dir.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { //过滤规则,是文件夹,或 是.xming ,返回true return pathname.isDirectory()|| pathname.getName().toLowerCase().endsWith(".xmind"); } }); */ //lambda 表达式优化 File[] file = dir.listFiles(( pathname)-> pathname.isDirectory()|| pathname.getName().toLowerCase().endsWith(".xmind") ); /*File[] file = dir.listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return new File(dir,name).isDirectory() || name.toLowerCase().endsWith("xmind"); } });*/ //上面可以简化,使用lambda 表达式,优化匿名类。使用前提:接口中只有一个抽象方法。 /*File[] file = dir.listFiles((File di, String name) ->{ return new File(di,name).isDirectory() || name.toLowerCase().endsWith("xmind"); });*/ //上面继续简化 /* File[] file = dir.listFiles(( di, name) -> new File(di,name).isDirectory() || name.toLowerCase().endsWith("xmind") );*/ /* 过滤器的原理 listFiles一共做了3件事情: 1、对构造方法中传递的目录进行遍历,获取目录中的每一个文件/夹, 被封装成File对象 2、listFiles方法会调用参数传递的过滤器中的方法accept 3、listFiles会把遍历得到的每一个File对象传递给accept方法的参数pathname。返回一个true accept方法返回值是一个boolean.返回true 会把传递过去的File对象保存到file数组中,返回false不会保存到数组中 过滤的规则: accept中判断对象file 对象是否以xmind结尾,是返回true ,不是返回false */ /* 解决办法: 需要对遍历到的file1是否是文件夹,如果是文件夹,则继续遍历则文件夹file1 。 调用getAllFile()即可。 如果是文件,直接打印即可。 */ for (File file1 : file) { if (file1.isDirectory()){ getAllFile(file1); } else{ //file1是一个文件,直接打印即可 System.out.println(file1); } } }}
持续用lambda 表达式优化
作者:杜艳_66c4
链接:https://www.jianshu.com/p/05c195fb99a4