Java_FileFilter过滤器的原理和使用

FileFilter

public interface FileFilter

  • 该接口的实例可以传递给File类的listFiles(FileFilter)方法。
  • 实现该接口需要实现接口中的accept()方法

accept
boolean accept
测试指定的抽象路径名是否应包含在路径名列表中。
参数
pathname - 要测试的抽象路径名
结果
true if and only if pathname should be included

案例

需求:在指定文件夹中找到所有的".xlsx"文件
思路:遍历文件夹的所有文件,如果有子文件夹,继续遍历子文件夹
代码实现
测试类

public static void main(String[] args) {
  File file = new File("D:\\test");
  getAllFile(file);
}

/**
 * 遍历文件夹里的内容
 * @param file
 */
public static void getAllFile(File file) {
  // 将文件夹转成数组类型
  File[] files = file.listFiles(new FileFilterImpl());
  // 遍历数据
  for (File file1 : files) {
    /*
    判断如果file1是个文件夹,则继续遍历这个文件夹
    因为getAllFile()方法就是遍历文件夹的方法 所以直接调用自己就行 这就是递归
    */
    if (file1.isDirectory()) {
      getAllFile(file1);
      /*
      如果不是文件夹 打印
      */
    } else {
      System.out.println(file1);
    }
  }
}

FileFilter实现类

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

public class FileFilterImpl implements FileFilter {
  @Override
  public boolean accept(File pathname) {
    // 如果是文件夹 直接返回true
    if (pathname.isDirectory()) {
      return true;
    }
    return pathname.toString().toLowerCase().endsWith(".xlsx");
  }
}

代码解读
首先必须明确两件事:

  1. 过滤器中的accept方法是谁调用的
  2. accept方法中的pathname是什么?

带着问题继续往下看
代码难点在于将文件夹转成数组类型这句。listFiles可以将File类型的文件转为File类型的集合,同时又加上了对文件的过滤。代码执行到listFiles方法的时候,一共做了三件事:

  1. listFiles方法对构造方法中传递的目录进行遍历,获取目录中的每一个文件夹或文件,最后封装成File对象;
  2. listFiles方法会调用参数传递的过滤器中的方法accept
  3. listFiles方法会把遍历得到的每一个File对象传递给accept方法的参数pathname

过滤器的规则:

  1. accept方法中,判断File对象是否是以".xlsx"结尾的,是就返回true,不是就返回false
  2. 如果传递进来的File对象是一个文件夹,直接返回true

accept方法返回的是一个布尔值
true:就会把传递过去的file对象保存到File数组中
false:就不会把传递过去的file对象保存到File数组中

希望本篇文章对您有所帮助,感谢观看!

你可能感兴趣的:(Java_FileFilter过滤器的原理和使用)