// 下面是File类中的list方法源码
public String[] list(FilenameFilter filter) {
// 获取到该目录下所有的文件或者文件夹名称,放到一个字符串数组中。
String names[] = list();
// 判断如果数组对象是null,或者过滤器对象是null,直接返回这个对象数组
if ((names == null) || (filter == null)) {
return names;
}
// 创建List集合
List<String> v = new ArrayList<>();
// 遍历字符串数组,得到每一个文件或者文件夹名称
for (int i = 0 ; i < names.length ; i++) {
// 过滤器对象调用accept方法,根据返回值,决定是否往集合添加该文件(夹)名称。
// 如果是true,添加。否则,不添加。
// 而根据多态的特点:接口的引用调用方法,该accept方法将会执行我们重写的。
// 这两个参数,第一个this:谁调用方法谁就是this对象。那么此处的this就代表了调用方法的目录dir。
// 第二个参数,就是目录dir下遍历到的每一个文件或者文件夹名称
// 到这,去看我们的实现
if (filter.accept(this, names[i])) {
// 将文件(夹)名称添加到集合
v.add(names[i]);
}
}
// 将那些添加到集合的文件(夹)名称,转数组返回。
return v.toArray(new String[v.size()]);
}
// 下面是文件名称过滤器接口
public interface FilenameFilter {
// 定义了返回boolean值的accept方法,接收一个父目录,一个文件或者文件夹名称
boolean accept(File dir, String name);
}
// 下面是我们的代码
// 将D盘根目录封装成File对象
File file = new File("D:\\");
// 调用list方法,传递一个以匿名内部类的方式实现的文件名称过滤器
String[] files = file.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
// 通过源码分析,我们知道了dir就是我们上面封装的file目录
// 而name就代表这个目录下的文件或者文件夹名称
// 根据File类的第三个构造,将父目录和文件(夹)名称拼起来,构建File对象
File file = new File(dir, name);
// 使用这个file对象的方法,判断它是一个文件,并且名称是以xxx结尾。
// 如果满足这两个条件就返回true,那么再去看源码,发现返回true,就会把这个文件名添加到集合中去。
return file.isFile() && name.endsWith(".png");
}
}); |
|