编程那点事编程那点事

专注编程入门及提高
探究程序员职业规划之道!

Java遍历目录下的文件

在表中列举的方法中有一个list()方法,该方法用于遍历某个指定目录下的所有文件的名称,例8-25中没有演示该方法的使用,接下来通过一个案例来演示list()方法的用法,如例所示。

import java.io.File;
public class IOTest {
    public static void main(String[] args) {
        File file = new File("D:/"); // 创建File 对象
        if (file.isDirectory()) { // 判断File 对象对应的目录是否存在
            String[] names = file.list(); // 获得目录下的所有文件的文件名
            for (String name : names) {
                System.out.println(name); // 输出文件名
            }
        }
    }
}

例中,创建了一个File对象,封装了一个路径,通过调用File的isDirectory()方法判断路径指向的是否为存在的目录,如果存在就调用list()方法,获得一个String类型的数组names,数组中包含这个目录下所有文件的文件名。接着通过循环遍历数组names,依次打印出每个文件的文件名。

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

为了让初学者更好地理解文件过滤的原理,接下来分步骤分析list(FilenameFilter filter)方法的工作原理。

  • 调用list()方法传入FilenameFilter文件过滤器对象。

  • 取出当前File对象所代表目录下的所有子目录和文件。

  • 对于每一个子目录或文件,都会调用文件过滤器对象的accept(File dir,String name)方法,并把代表当前目录的File对象以及这个子目录或文件的名字作为参数dir和name传递给方法。

  • 如果accept()方法返回true,就将当前遍历的这个子目录或文件添加到数组中,如果返回false,则不添加。

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

import java.io.File;
import java.io.FilenameFilter;
public class IOTest {
    public static void main(String[] args) {
        // 创建File 对象
        File file = new File("D:/test");
        // 创建过滤器对象
        FilenameFilter filter = new FilenameFilter() {
            // 实现accept()方法
            public boolean accept(File dir, String name) {
                File currFile = new File(dir, name);
                // 如果文件名以.java 结尾返回true,否则返回false
                if (currFile.isFile() && name.endsWith(".java")) {
                    return true;
                } else {
                    return false;
                }
            }
        };
        if (file.exists()) { // 判断File 对象对应的目录是否存在
            String[] lists = file.list(filter); // 获得过滤后的所有文件名数组
            for (String name : lists) {
                System.out.println(name);
            }
        }
    }
}

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

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

import java.io.File;
public class IOTest {
    public static void main(String[] args) {
        File file = new File("D:/test"); // 创建一个代表目录的File 对象
        fileDir(file);
    }
    public static void fileDir(File dir) {
        File[] files = dir.listFiles(); // 获得表示目录下所有文件的数组
        for (File file : files) { // 遍历所有的子目录和文件
            if (file.isDirectory()) {
                fileDir(file); // 如果是目录,递归调用FileDir()
            }
            System.out.println(file.getAbsolutePath()); // 输出文件的绝对路径
        }
    }
}

运行结果:

D:\test\one
D:\test\test.txt
D:\test\two

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

未经允许不得转载: 技术文章 » Java编程 » Java遍历目录下的文件