------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
文件名过滤器的源码解析
文件名过滤器的作用是:
把指定目录中符合要求的文件名提取出来,一般用在对给定目录中的文件进行处理的操作中。
例:把E盘下以.jpg结尾的文件名输出。
分析:
A:把符合要求的文件名提取出来,存放在一个数组中
文件名过滤器可以帮做我们把符合要求的文件名提取出来
B:遍历数组也就得到了想要的结果。
文件名过滤器是怎么实现的呢?
File file = new File("e:\\");
String[] strArray = file.list(FilenameFilter fileter);
//通过list方法获取文件名数组,这里如果list方法中没有参数则返回由所有文件名组成的数组
//如果有FilenameFilter对象做参数,这要经过FilenameFilter的accept方法判断后返回符合条件的文件名添加到数组中。
/*
看list的方法源码:
public String[] list(FilenameFilter filter) {
String names[] = list();
if ((names == null) || (filter == null)) { //如果list方法中没有参数直接返回字符串数组
return names;
}
List<String> v = new ArrayList<>(); //如果有文件名过滤器,则执行这些操作
for (int i = 0 ; i < names.length ; i++) {
if (filter.accept(this, names[i])) {
//this代表调用list方法的File对象
//name[i]代表File.list返回的数组中各个元素
//即把File对象和没有经过判断组成的数组各元素传递给accept方法,我们可以重写accept方法来得到自己想要的结果
v.add(names[i]);
}
}
return v.toArray(new String[v.size()]);
}
查看FilenameFilter
public interface FilenameFilter {
boolean accept(File dir, String name);
}
发现这个FilenameFilter只是一个接口,且接口中只有一个accept方法
如果一个方法的形式参数是一个接口,说明实际参数应该是这个接口的子类对象,
需要重写这个方法。
*/
new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return new File(dir, name).isFile() && name.endsWith(".jpg"); //即如果File对象下有以".jpg"结尾的文件则返回true
//然后list方法会把其添加到数组中
}}
总结:
当list方法中有FilenameFilter参数时,list会在方法内先生成一个没有经过判断的数组,并把对象(File dir)和数组中的元素(String name)传递给
FilenameFilter的accept方法,我们可以重写accept方法,来得到满足条件的文件名。当accept方法的返回值为true时,list才真正的把其放到返回的数组中。
实例:
import java.io.File;
import java.io.FilenameFilter;
/*
* 把f盘下以.txt结尾的文件的文件名输出。
* FilenameFilter解析
*/
public class FilenameFilterDemo {
public static void main(String[] args) {
//指向F盘
File filef = new File("f:\\");
//把F盘封装为一个数组,并利用文件名过滤器提取出符合要求的文件名
String[] st = filef.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return new File(dir,name).isFile() && name.endsWith(".txt");
}
});
//遍历数组
for(String s :st){
System.out.println(s);
}
}
}