Comprehensive case-file filter optimization and filter principle

Requirements:
Traverse c:\abc...

我们可以使用过滤器来实现
在File类中有两个和listFiles重载的方法,方法的参数传递的就是过滤器
File[] listFiles(FileFilter filter)
java.io.FileFilter接口:用于抽象路径名(File对象)的过滤器
    作用:用来过滤文件(File对象)
    抽象方法:用来过滤文件的方法
        boolean accept(File pathname) 测试指定抽象路径名是否应该包含在某个路径名列表中
        参数:
            File pathoname:使用listFiles方法遍历目录,得到的每一个文件对象
File[] listFiles(FilenameFilter filter)
java.io.FilenameFilter接口:实现此接口的类实例可用于过滤器文件名
    作用:用于过滤文件名称
    抽象方法:用来过滤文件的方法
        boolean accept(File dir, String name) 测试指定文件是否应该包含在某一文件列表中
        参数:
            File dir :构造方法中传递的被遍历的目录
            String name: 使用listFiles方法遍历目录,获取的每一个文件/文件名的名称

Note: The
two filter interfaces have no implementation classes. We need to write the implementation classes ourselves, override the filter method accept, and define the filtering rules in the method.

analysis:

  1. Interface as a parameter, you need to pass subclass objects and override the methods. We choose the anonymous inner class method, which is relatively simple.
  2. Accept method, the parameter is File, which means all sub-files and sub-directories under the current File. It returns true if it is kept, and false if it is filtered out. Retention rules:
    1.1 Either a .java file.
    1.2 Either it is a directory, used to continue traversal.
  3. Through the function of the filter, in the array elements returned by listFiles(FileFilter), the subfile objects are all eligible and can be printed directly.

Code:

public class Demo01Filter {
    
    
    public static void main(String[] args) {
    
    
        File file = new File("C:\\abc");
        getAllFile(file);
    }

    /*
        定义一个方法,参数传递File类型的目录
        方法中对目录进行遍历
    */
    public static void getAllFile(File dir){
    
    

        File[] files = dir.listFiles(new FileFfilterImpl());//打印被遍历的目录名称
        for (File f : files) {
    
    
            //对遍历得到的File对象f进行判断,判断是否是文件夹
            if(f.isDirectory()){
    
    
                //f是一个文件夹,则继续遍历这个文件夹
                //getAllFile方法就是传递文件夹,比那里文件夹的方法
                //所以直接调用getAllFile方法即可:递归(自己调用自己)
                getAllFile(f);
            }else {
    
    
                //f是一个文件,直接打印即可
                System.out.println(f);
            }
        }
    }
}

import java.io.File;
import java.io.FileFilter;

/*
    创建过滤器FileFilter的实现类,重写过滤方法accept,定义过滤规则
*/
public class FileFfilterImpl implements FileFilter {
    
    
    @Override
    public boolean accept(File pathname) {
    
    
        /*
            过滤的规则:
            在accept方法中,判断File对象是否是以.java结尾
            是返回true
            不是返回false
        */
        //如果pathname是一个文件夹,返回true,继续遍历这个文件夹
        if (pathname.isDirectory()){
    
    
            return true;
        }
        return pathname.getName().toLowerCase().endsWith(".java");
    }
}

Program demonstration:
Insert picture description here
Insert picture description here
filter principle:
Insert picture description here
lambda optimization:
analysis: FileFilter is an interface with only one method, so lambda expressions can be abbreviated.
Lambda format:

()->{
    
    }

Code:

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");
           }
       });

        //使用lambda表达式优化匿名内部类(接口中只有一个抽象方法)
        File[] files = dir.listFiles((File d,String name)->{
    
    
            //过滤规则,pathname是文件夹或者是.java结尾的文件返回true
            return new File(dir,name).isDirectory() || name.toLowerCase().endsWith(".java");
        });
        //继续优化
       File[] files = dir.listFiles(( d, name)->new File(dir,name).isDirectory() || name.toLowerCase().endsWith(".java"));

 File[] files = dir.listFiles(new FileFilter() {
    
    
            @Override
            public boolean accept(File pathname) {
    
    
                //过滤规则,pathname是文件夹或者是.java结尾的文件返回true
                return pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java");
            }
        });
        File[] files = dir.listFiles( pathname-> pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java"));

Guess you like

Origin blog.csdn.net/weixin_44664432/article/details/108475603