文件过滤器的使用

在File类中有两个和listFiles重载的方法,方法的参数传递的就是过滤器:

  1. File[] listFiles(FileFilter filter)

    作用:用来过滤文件(File对象)
    参数:File pathname:使用listFile方法遍历目录,得到的每一个文件对象

  2. File[] listFiles(FilenameFilter filter)

    作用:用于过滤文件名称
    参数:File dir:构造方法中传递的被遍历目录
    String name:使用listFile方法遍历目录,获得每一个文件或文件夹的名称

注意:两个过滤器接口是没有实现类的,需要我们自行写实现类,然后accept()方法重写过滤规则。

接下来我们通过一个小案例实现文件过滤功能:
需求:给定一个文件目录,查找出以.java结尾的文件

首先我们先使用第一个过滤方法File[] listFiles(FileFilter filter)来实现此功能

public class test {
    public static void main(String[] args) {
        File file = new File("C:\\Users\\lenovo\\Desktop\\java笔记");
        getAllFile(file);
    }

    private static void getAllFile(File file) {
        //传递过滤对象
        File[] files = file.listFiles(new FileFilter(){
            /**
             * 实现FileFilter接口中的accept方法,重写过滤规则
             * @param pathname
             * @return
             */
            @Override
            public boolean accept(File pathname) {
                return pathname.isDirectory() || pathname.getPath().toLowerCase().endsWith(".java");
            }
        });

        for(File filename :files){
            if(filename.isDirectory()){
                getAllFile(filename);
            }else{
                System.out.println(filename);
            }
        }
    }

}

接下来我们来分析一下这个过滤器实现的原理,主要分为以下几步:

  1. listFiles方法会对构造器传递过来的目录进行遍历,获取每一个文件或文件夹,然后封装为File对象
  2. listFiles方法会调用参数传递的过滤器中的accept()方法
  3. listFiles方法将遍历得到的每一个File对象,传递给accept()方法中的参数pathname
  4. accept()方法接收到pathname的值后,根据用户自行重写的过滤规则,然后进行过滤,当符合过滤规则时,返回true,并把传递过来的File对象保存到File数组中;若不符合过滤规则,则返回false,不会把传递过来的File对象保存到File数组中

第二种实现方式:

public class test {
    public static void main(String[] args) {
        File file = new File("C:\\Users\\lenovo\\Desktop\\java笔记");
        getAllFile(file);
    }

    private static void getAllFile(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(".java");
            }
        });

        for(File filename :files){
            if(filename.isDirectory()){
                getAllFile(filename);
            }else{
                System.out.println(filename);
            }
        }
    }

}

两种方式实现原理差不多,所以不再重复说啦~~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值