文件过滤器

  • 用到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);
                  }
              }
          }
      }
      
posted @ 2020-12-14 23:40  MikiKawai  阅读(316)  评论(0编辑  收藏  举报