JavaIO FilenameFilter接口

FilenameFilter介绍

看了Java编程思想这本书,书中介绍了FilenameFilter类,同时还介绍了策略模式,但是这里先不关心策略模式,只关心FilenameFilter怎么使用。

获取全部列表

在使用File对象调用不带参数的list()方法,我们会得到该File对象包含的全部列表。
例如
(1)String[] flist = file.list();
(2)File[] flist = file.listFiles();
这两个方法返回file下的所有文件或目录;

获取受限列表

然而有的时候我们并不需需要获取全部列表,我们只想获取一个受限的列表。例如,我们想得到所有扩展名为.java的文件,这种情况下,我们就需要用到FilenameFilter
调用方式如下:
(1)String [] fs = f.list(FilenameFilter filter);
(2)File[]fs = f.listFiles(FilenameFilter filter);

其中java.io.FilenameFilter是文件名过滤器,作为list()过滤的标准。list()方法中传入FilenameFilter实例,list方法就可以根据FilenameFilter实例中的accept()方法作为过滤的依据。来过滤不符合规格的文件名,留下合格的文件。可以看list()的源码来详细了解调用accpet()方法的过程。

list(FilenameFilter filter)源码:

    public String[] list(FilenameFilter filter) {
        String names[] = list();
        if ((names == null) || (filter == null)) {
            return names;
        }
        List<String> v = new ArrayList<>();
        for (int i = 0 ; i < names.length ; i++) {
            if (filter.accept(this, names[i])) {
                v.add(names[i]);
            }
        }
        return v.toArray(new String[v.size()]);
    }

可以看到,list(FilenameFilter filter)这个方法,还是先调用无参的list()方法,获取所有的列表,然后再调用FilenameFilter接口实例的accept()方法进行过滤,将符合条件的加入到List集合中,最后把List集合转为String数组返回。

如何使用文件名过滤器进行过滤

1.通过实现FilenameFilter接口方式过滤文件

例子:

package thinkinjava.io;
import java.util.regex.*;
import java.io.*;
import java.util.*;

public class DirList
{
    public static void main(String[] args)
    {
        File path = new File(".");
        String[] list;
        if (args.length == 0)

            list = path.list();
        else
            //传入一个FilenameFilter接口的实例来实现过滤
            list = path.list(new MyFilter(args[0]));
        Arrays.sort(list, String.CASE_INSENSITIVE_ORDER);
        for (String dirItem : list)
            System.out.println(dirItem);
    }
}
//实现接口方式使用文件名过滤器
class MyFilter implements FilenameFilter
{
    private Pattern pattern;
    public MyFilter(String regex)
    {
        pattern = Pattern.compile(regex);
    }
    //实现文件名过滤器接口的里的方法
    public boolean accept(File dir, String name)
    {
        return pattern.matcher(name).matches();
    }
}

在上面的MyFilter类中的accept方法中,我们使用正则表达式来匹配文件名,如果匹配则返回true,这样list方法就把这个符合的文件添加到集合中。如果不匹配就不添加到集合中,这样就实现了过滤操作。
当前工程下的目录和文件为:
这里写图片描述
使用命令行参数:test.*获取所有文件或目录包含test的文件名列表。
这里写图片描述
运行效果如下

test1.pdf
test1.txt
test2.pdf
test2.txt
test3.pdf
test3.txt
test4.pdf

2.使用匿名内部类方式实现文件过滤

package thinkinjava.io;
import java.util.regex.*;
import java.io.*;
import java.util.*;

public class DirList
{
    public static void main(String[] args)
    {
        File path = new File(".");
        String[] list;
        if (args.length == 0)
            list = path.list();
        else
            //实现接口的方式实现文件名过滤
            list = path.list(new FilenameFilter()
            {
                //编译正则表达式
                private Pattern pattern=Pattern.compile(args[0]);;
                @Override
                public boolean accept(File dir, String name)
                {
                    return pattern.matcher(name).matches();
                }
            });
        Arrays.sort(list, String.CASE_INSENSITIVE_ORDER);
        for (String dirItem : list)
            System.out.println(dirItem);
    }
}

运行效果与上面一样,不列举

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值