Java的File过滤器(FileFilter和FilenameFilter)

public File[] listFiles() :返回一个File数组 表示该File目录中的所有的子文件或目录

listFiles()方法可传入两种参数实现文件的过滤
listFiles(FileFilter filter)listFiles(FilenameFilter filter)

1、FileFilter文件过滤器

java.io.FileFilter接口:用于抽象路径名(File对象)的过滤器
作用:用于过滤File文件
接口里唯一的抽象方法:boolean accept(File pathname) :测试pathname是否应该包含在当前File目录中 若符合则返回true
参数:使用ListFiles方法遍历目录后 得到的每一个文件对象

注:这两个过滤器接口没有实现类
须自己写实现类 然后重写过滤的方法(accept()) 在方法中自己定义过滤的规则

  • 1、listFiles()方法会对构造方法中传递的目录进行遍历
    并获取目录中的每一个文件或文件夹 然后封装成File对象
  • 2、listFiles()方法会调用传递进来的过滤器中的accept()方法
  • 3、listFiles()方法会将遍历得到的每一个File对象传递给accept()方法的pathname参数

accept()方法返回的是一个布尔值:

  • true:将传递过去的File对象保存到File数组中(放行)
  • false:不将传递过去的File对象保存到File数组中

案例:遍历指定路径下所有.java结尾的文件

FileFilter过滤器类:

public class FileFilterImpl implements FileFilter
{
    @Override
    public boolean accept(File pathname) {
        if (pathname.getName().toLowerCase().endsWith(".java"))
        {
            return true;
        }
        // 若pathname是文件夹 则返回true 继续遍历这个文件夹
        return pathname.isDirectory();
    }
}

主类:

public static void main(String[] args) {
	// 给出路径
	File file=new File("F:\\IdeaProjects\\filetest");
    getAllFile(file);
}

// 定义一个方法 参数传递File类型的目录 方法中对目录进行遍历
private static void getAllFile(File dir)
{
    File[] files = dir.listFiles(new FileFilterImpl());// 传递过滤器对象
    for (File f:files)
    {
        if (f.isDirectory())
        {
            // 递归调用
            getAllFile(f);
        }
        else
        {
            System.out.println(f);
        }
    }
}

匿名内部类方式简化:

public static void main(String[] args) {
	// 给出路径
	File file=new File("F:\\IdeaProjects\\filetest");
    getAllFile(file);
}

// 定义一个方法 参数传递File类型的目录 方法中对目录进行遍历
private static void getAllFile(File dir)
{
    File[] files = dir.listFiles(new FileFilter() {
        @Override
        public boolean accept(File pathname) {
            // 过滤规则
            return pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java");
        }
    });// 匿名内部类的方式传递过滤器对象

    for (File f:files)
    {
        if (f.isDirectory())
        {
            // 递归调用
            getAllFile(f);
        }
        else
        {
            System.out.println(f);
        }
    }
}

Lambda表达式简化:

public static void main(String[] args) {
	// 给出路径
	File file=new File("F:\\IdeaProjects\\filetest");
    getAllFile(file);
}

// 定义一个方法 参数传递File类型的目录 方法中对目录进行遍历
private static void getAllFile(File dir)
{
    File[] files = dir.listFiles((File pathname) -> pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java"));

    for (File f:files)
    {
        if (f.isDirectory())
        {
            // 递归调用
            getAllFile(f);
        }
        else
        {
            System.out.println(f);
        }
    }
}

2、FilenameFilter文件名过滤器

java.io.FilenameFilter接口:实现此接口的类实例可用于过滤器文件名
作用:用于过滤文件名称
接口里唯一的抽象方法:boolean accept(File dir,String name) 测试指定文件是否应该包含在某一文件列表中

参数:

  • File dir:构造方法中传递的被遍历的目录(注意 是File类型的)
  • String name:使用ListFiles方法遍历目录从而得到的每一个文件或文件夹的名称

accept()方法返回的是一个布尔值:

  • true:将传递过去的File对象保存到File数组中(放行)
  • false:不将传递过去的File对象保存到File数组中

还是那个案例:遍历指定路径下所有.java结尾的文件

匿名内部类形式:

public static void main(String[] args) {
	// 给出路径
    File file=new File("F:\\IdeaProjects\\filetest");
    getAllFile(file);
}

// 定义一个方法 参数传递File类型的目录 方法中对目录进行遍历
private static void getAllFile(File dir)
{
    File[] files=dir.listFiles(new FilenameFilter() {
        @Override
        public boolean accept(File dir, String name) {
            // 目录名dir须和文件名name组合成为一个文件对象进行判断
            return new File(dir,name).isDirectory() || name.toLowerCase().endsWith(".java");
        }
    });

    for (File f:files)
    {
        if (f.isDirectory())
        {
            // 递归调用
            getAllFile(f);
        }
        else
        {
            System.out.println(f);
        }
    }
}

使用Lambda表达式简化:

public static void main(String[] args) {
	// 给出路径
    File file=new File("F:\\IdeaProjects\\filetest");
    getAllFile(file);
}

// 定义一个方法 参数传递File类型的目录 方法中对目录进行遍历
private static void getAllFile(File dir)
{
    // 使用Lambda表达式再次简化匿名内部类
	// 使用前提:接口中只有一个抽象方法
	// File[] files=dir.listFiles((File d,String name) -> {
	//     return new File(d,name).isDirectory() || name.toLowerCase().endsWith(".java");
	// });

	// 再次简化Lambda表达式
	File[] files=dir.listFiles((d,name) -> new File(d,name).isDirectory() || name.toLowerCase().endsWith(".java"));

    for (File f:files)
    {
        if (f.isDirectory())
        {
            // 递归调用
            getAllFile(f);
        }
        else
        {
            System.out.println(f);
        }
    }
}

发布了56 篇原创文章 · 获赞 0 · 访问量 1164

猜你喜欢

转载自blog.csdn.net/Piconjo/article/details/104682590