Java 文件过滤器的简单使用
一、Java文件过滤器接口
FileFilter 和 FilenameFilter 接口 是 Java 提供的文件筛选相关接口,可在遍历目录时使用此接口按照一定要求,筛选出所需要的文件。
FileFilter 和 FilenameFilter 来自 java.io 包,用于文件过滤规则的定义 FileFilter 和 FilenameFilter 是接口,过滤规则是由自己创建实现类定义的。 FileFilter 和 FilenameFilter 接口使用方式大同小异 FileFilter 接口只有一个抽象方法 boolean accept(File pathname);。 FilenameFilter 接口只有一个抽象方法 boolean accept(File dir, String name);。 除了创建实现类和使用匿名对象使用 FileFilter 和 FilenameFilter 接口外,也可 Java 8 之后的 lambda 表达式。
二、使用步骤
需求分析: 筛选某个目录下所有以 .java 结尾的文件(不区分大小写)。 . 编码分析: 1.获取当前目录下所有文件夹及文件名称(使用File 类的 listFiles 方法) 2.判断文件是否符合要求(.java 结尾) 3.在控制台打印符合要求的文件目录
【tips】
listFiles 有三种重载形式 FileFilter 和 FilenameFilter 将作为参数传递给 listFiles 方法 ①File[] listFiles() 返回所有的文件和目录 ②File[] listFiles(FileFilter filter) 返回符合过滤规则的文件和目录 ③File[] listFiles(FilenameFilter filter) 返回符合过滤规则的文件和目录
1.普通实现方式(不使用过滤器接口)
public class Recursion { public static void main(String[] args) { File dir= new File("C:\filter"); // 获取参数路径下所有的目录与文件 File[] files = dir.listFiles(); for (File file : files) { //如果 file 不是 目录,继续判断文件是否以 .java 结尾(忽略大小写) if(!file.isDirectory() && file.getName().toLowerCase().endsWith(".java")){ // 打印文件路径 System.out.println(file); } } } }
2.使用过滤器接口
①使用 FileFilter 接口
// 创建 FileFilter 接口实现类 重写 accept方法 class FileFilterImpl implements FileFilter { @Override public boolean accept(File pathname) { // 如果不是文件夹并且以.java结尾返回true if (!pathname.isDirectory() && pathname.getName().toLowerCase().endsWith(".java")) { return true; } return false; } } public class Recursion { public static void main(String[] args) { File dir= new File("C:\filter"); // 将 FileFilterImpl 作为 listFiles 方法参数 File[] files = dir.listFiles(new FileFilterImpl()); // 遍历过滤后的结果 for (File file : files) { System.out.println(file); } } }
②使用 FilenameFilter 接口
public class Recursion { public static void main(String[] args) { File dir = new File("C:\filter"); // 获取参数路径下所有的目录与文件 // 未创建实现类,直接使用匿名内部类 File[] files = dir.listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { // 这里需要将 参数dir,name构造为 File之后再判断是否为目录 if (!new File(dir,name).isDirectory() && name.toLowerCase().endsWith(".java")) { return true; } return false; } }); for (File file : files) { System.out.println(file); } } }
目录与控制台打印结果
总结
个人认为在一些简单的场景使用这种方式有些鸡肋, 但毕竟还是要了解这部分知识,知道 Java API 存在这个东西的,以便日后为你所用。