0、
    在上一小节 File 类中的常用方法表中有一个 list()方法,该方法用于遍历某个指定目录下的所有文件的名称,接下接下来通过一个案例来演示 list()方法的用法,如下所示。

    1. import java.io.File;
    2. public class example12 {
    3. public static void main(String[] args) throws Exception{
    4. //创建 File 对象
    5. File file = new File("C:\\Users\\yuchuang\\eclipse-workspace\\chapter 07");
    6. if (file.isDirectory()) { //判断 File 对象对应的目录是否存在
    7. String[] names = file.list(); //获得目录下的所有文件的文件名
    8. for (String name : names) {
    9. System.out.println(name); //输出文件名
    10. }
    11. }
    12. }
    13. }

    运行结果如下所示。
    QQ截图20200611213027.png
    上述代码块中,创建了一个 File 对象,并指定了一个路径,通过调用 File 的 isDirectory()方法判断路径指向的是否为存在的目录,如果存在就调用 list()方法,获得一个 String 类型的数组 names,数组中包含这个目录下所有文件的文件名。接着通过循环遍历出每个文件的文件名,依次打印出每个文件的文件名。

    它实现了遍历一个目录下所有文件的功能,然而有时程序员只是需要得到指定类型的文件,如获取指定目录下所有指定类型的文件,如获取指定目录下所有的“.java”文件。针对这种需求,File 类中提供了一个重载的 list(FilenameFilter filter)方法,该方法接收一个 filenameFilter,并在 accept()方法中做出判断,从而获得指定类型的文件。FilenameFiter 是一个接口,被称作文件过滤器,当中定义了一个抽象方法 accept(File dir, String name)。在调用 list()方法时,需要实现文件过滤器 FilenameFilter,并在 accept()方法中做出判断,从而获得指定类型的文件。

    1、
    接下来分步骤分析 list(FilenameFilter fiter)方法的工作原理。

    1. 调用 list()方法传入 FilenameFiter 文件过滤器对象
    2. 取出当前 File 对象所代表目录下所有子目录和文件
    3. 对于每一个子目录或文件,都会调用文件过滤器对象的 accept(Flie dir, String name)方法,**并把代表当前目录的 File 对象以及这个子目录或文件的名字作为 dir 和 name 传递给方法**
    4. 如果 accept()方法返回 true,就将当前遍历的这个子目录或文件添加到数组中,如果返回 false,则不添加

    接下来通过一个案例来演示如何遍历指定目录下所有扩展名为“.txt”的文件,如下所示。

    import java.io.File;
    import java.io.FilenameFilter;
    
    public class example13 {
        public static void main(String[] args) {
            //创建 File 对象
            File file = new File("C:\\Users\\yuchuang\\eclipse-workspace\\chapter 07");
            //创建过滤器对象
            FilenameFilter filter = new FilenameFilter() {
                //重写 accept()方法
                @Override    
                public boolean accept(File dir, String name) {
                    //dir 文件的父路径
                    //name 文件的名称
                    File currFile = new File(dir, name);    //调用构造方法 File(file parent, String child)
                    //如果文件名以 .txt 结尾返回 true,否则返回 false
                    if (currFile.isFile() && name.endsWith(".txt")) {
                        return true;
                    }else {
                        return false;
                    }
                }
            };
            if (file.exists()) {    //判断 File 对象对应的目录是否存在
                String[] lists = file.list(filter);    //获得过滤后的所有文件名数组
                for (String name : lists) {
                    System.out.println(name);
                }
            }
        }
    }
    

    运行结果如下所示。
    QQ截图20200611220751.png

    在上述代码块中定义了 FilenameFilter 文件过滤器对象 filter,并且实现了 accept()方法。在 accept()方法中,对当前正在遍历的 currFile 对象进行了判断,只有当 currFile 对象代表文件,并且扩展名为“.txt”时,才返回 true。在调用 File 对象的 list()方法时,将 filter 对象传入,就得到了包含所有“.txt”文件名字的字符串数组。

    2、
    前两个例子演示的都是遍历目录下文件的文件名,有时候在一个目录下,除了文件,还有子目录,如果想得到所有子目录下的 File 类型对象,list()方法显然不能满足需求,这时需要使用 File 类提供的另一个方法 listFiles()。listFiles()方法返回一个包含了 File 对象**所有子文件和子目录**的 File 数组,当对数组中的元素进行遍历时,如果元素中还有子目录需要遍历,则需要使用递归。接下来通过一个案例来实现遍历指定目录下的文件,如下所示。

    import java.io.File;
    
    public class example14 {
        public static void main(String[] args) {
            //创建一个代表目录的 File 对象
            File file = new File("C:\\Users\\yuchuang\\eclipse-workspace\\chapter 07");
            //调用 fileDir()方法
            fileDir(file);    
        }
        public static void fileDir(File dir) {
            //获得表示目录下所有文件的数组
            File[] files = dir.listFiles();    
            for (File file : files) {    //遍历所有的子目录和文件
                if (file.isDirectory()) {
                    fileDir(file);    //如果是目录,递归调用 dileDir()
                }
                System.out.println(file.getAbsolutePath());    //输出打印文件的绝对路径
            }
        }
    }
    

    运行结果如下所示。
    QQ截图20200612152209.png
    上述代码块中定义了一个静态方法 fileDir(),该方法接收一个表示目录的 File 对象。在方法中,首先通过调用 listFiles()方法把该目录下所有的子目录和文件存放到一个 File 类型的数组 files 中,接着遍历数组 files,并对当前遍历的 File 对象进行判断。如果是目录就重新调用 fileDir()方法进行递归,如果是文件就直接打印输出文件的路径,这样该目录下的所有的文件就被成功遍历出来了。