六 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 表达式优化

你可能感兴趣的:(六 File类与IO流——第三节 过滤器)