小编典典

如何遍历目录中的文件及其在 Java 中的子目录?

all

我需要获取目录中所有文件的列表,包括所有子目录中的文件。用Java完成目录迭代的标准方法是什么?


阅读 63

收藏
2022-07-16

共1个答案

小编典典

您可以File#isDirectory()用来测试给定的文件(路径)是否是一个目录。如果这是true,那么您只需再次调用相同的方法及其File#listFiles()结果。这称为递归

这是一个基本的启动示例:

package com.stackoverflow.q3154488;

import java.io.File;

public class Demo {

    public static void main(String... args) {
        File dir = new File("/path/to/dir");
        showFiles(dir.listFiles());
    }

    public static void showFiles(File[] files) {
        for (File file : files) {
            if (file.isDirectory()) {
                System.out.println("Directory: " + file.getAbsolutePath());
                showFiles(file.listFiles()); // Calls same method again.
            } else {
                System.out.println("File: " + file.getAbsolutePath());
            }
        }
    }
}

请注意,StackOverflowError当树比
JVM 的堆栈可以容纳的更深时,这很敏感。如果您已经在使用 Java 8
或更新版本,那么您最好使用Files#walk()使用尾递归的方法:

package com.stackoverflow.q3154488;

import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class DemoWithJava8 {

    public static void main(String... args) throws Exception {
        Path dir = Paths.get("/path/to/dir");
        Files.walk(dir).forEach(path -> showFile(path.toFile()));
    }

    public static void showFile(File file) {
        if (file.isDirectory()) {
            System.out.println("Directory: " + file.getAbsolutePath());
        } else {
            System.out.println("File: " + file.getAbsolutePath());
        }
    }
}
2022-07-16