黑马程序员技术交流社区

标题: File类中的list方法源码 [打印本页]

作者: Angelv    时间: 2016-4-19 22:28
标题: File类中的list方法源码
// 下面是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");
                }
        });




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2