FilenameFilter

FileFilter和FilenameFilter

这两个接口在名称上就可以看的出来,是文件过滤器,只不过这两个接口在方法参数上有所不同。

先来看方法的区别

FileFilter接口:
    boolean accept(File pathname);  pathname 要测试的抽象路径名
    测试指定的抽象路径名是否应包含在路径名列表中。 
FilenameFilter接口:
    boolean accept(File dir, String name);  dir:当前目录,name:文件名
	测试指定文件是否应包含在文件列表中。

那么,何时才会用到他们呢?现在我们来看File类的三个方法。

public String[] list(FilenameFilter filter) {}
public File[] listFiles(FilenameFilter filter){}
public File[] listFiles(FileFilter filter) {}

这三个方法都能对文件进行过滤,但是返回值上会有不同,如果您只是想文件名,而不对文件进行操作,那么采用

list(FilenameFilter filter)方法会更加高效。

下面只要来对比一下 listFiles 这两个方法

先看源码:

 public File[] listFiles(FilenameFilter filter) {
        String ss[] = list();
        if (ss == null) return null;
        ArrayList<File> files = new ArrayList<>();
     	//先过滤,后创建
        for (String s : ss)
            if ((filter == null) || filter.accept(this, s))
                files.add(new File(s, this));
        return files.toArray(new File[files.size()]);
    }

    public File[] listFiles(FileFilter filter) {
        String ss[] = list();
        if (ss == null) return null;
        ArrayList<File> files = new ArrayList<>();
        for (String s : ss) {
            //先创建,后过滤
            File f = new File(s, this);
            if ((filter == null) || filter.accept(f))
                files.add(f);
        }
        return files.toArray(new File[files.size()]);
    }

从上面我们可以看出,listFiles(FilenameFilter filter)是先找到符合的文件名,然后再创建文件,
而 listFiles(FileFilter filter) 则是先创建文件,再进行比对。

所以,如果只对文件进行筛选的话,listFiles(FilenameFilter filter) 肯定是效率高的,

如果需要对文件进行一些操作,listFiles(FileFilter filter) 则会方便许多。

下面写一个测试

  1. 编写MyFileFilter和MyFileNameFilter

    public class MyFileFilter implements FileFilter {
    
        /**
         * 文件后缀名,比如  .jpg .txt 等
         */
        private String type;
    
        public MyFileFilter(String type) {
            this.type = type;
        }
    
        @Override
        public boolean accept(File pathname) {
            return pathname.getName().endsWith(type);
        }
      
    
    public class MyFileNameFilter implements FilenameFilter {
    
        /**
         * 文件类型,比如以txt、mp3 结尾的
         */
        private String type;
    
        public MyFileNameFilter(String type) {
            this.type = type;
        }
    
        @Override
        public boolean accept(File dir, String name) {
            return name.endsWith(type);
        }
    }
    
  2. 编写测试类

    public class Test {
        public static void main(String[] args){
    
            File file = new File("d:/");
            String[] list = file.list(new MyFileNameFilter(".md"));
            for (String s : list){
                System.out.println(s);
            }
    
            System.out.println("\nFileNameFilter: ");
            File[] files = file.listFiles(new MyFileNameFilter(".md"));
            for (File f : files){
                System.out.println(f.getName());
            }
    
            System.out.println("\nFileFilter: ");
            File[] files1 = file.listFiles(new MyFileFilter(".md"));
            for (File f : files1){
                System.out.println(f.getName());
            }
        }
    }
    
  3. 输出结果:

    FilenameFilter.md
    informatic.md
    mdeiawiki.md
    微信公众号搭建.md
    数据准备.md
    遇到的问题.md
    
    FileNameFilter: 
    FilenameFilter.md
    informatic.md
    mdeiawiki.md
    微信公众号搭建.md
    数据准备.md
    遇到的问题.md
    
    FileFilter: 
    FilenameFilter.md
    informatic.md
    mdeiawiki.md
    微信公众号搭建.md
    数据准备.md
    遇到的问题.md
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值