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);
}
}
运行效果与上面一样,不列举