ZetCode

Java DirectoryStream

最后修改于 2025 年 6 月 26 日

在本文中,我们将演示如何使用 DirectoryStream 接口在 Java 中遍历目录。 这种方法高效且非常适合处理目录内容,而无需一次性将所有内容加载到内存中。

DirectoryStream 提供了一种灵活的方式来遍历目录中的条目。 它与增强的 for 循环无缝集成,使开发人员能够以干净且可读的方式迭代文件和子目录。

要获得 DirectoryStream,请使用 Files.newDirectoryStream(Path dir) 方法。 此方法打开指定的目录并返回一个类似流的对象,该对象可用于一次访问每个条目。

DirectoryStream 列出主目录

第一个示例列出了用户的主目录。

Main.java
void main() throws IOException {

    var homeDir = Paths.get(System.getProperty("user.home"));

    try (var paths = Files.newDirectoryStream(homeDir)) {

        paths.forEach(System.out::println);
    }
}

该示例列出了用户主目录的内容。

DirectoryStream Globbing 示例

我们可以对内容流应用简单的 Globbing 操作。 Files.newDirectoryStream 的第二个参数是 glob 模式。

Main.java
void main() throws IOException {

    var dirName = Paths.get("C:/Users/Jano/Downloads");

    try (var paths = Files.newDirectoryStream(dirName, "*.pdf")) {

        paths.forEach(System.out::println);
    }
}

该示例显示了指定目录中的所有 PDF 文件。

DirectoryStream 过滤器示例

可以使用 DirectoryStream.Filter 应用更复杂的过滤操作。

Main.java
void main() throws IOException {

    DirectoryStream.Filter<Path> filter = file ->
            Files.size(file) < 100_000L && file.toString().endsWith(".jpg");

    var dirName = Paths.get("C:/Users/Jano/Downloads");

    try (var paths = Files.newDirectoryStream(dirName, filter)) {

        paths.forEach(System.out::println);
    }
}

该示例显示了所有小于 100 KB 的 JPEG 图像。

DirectoryStream 递归遍历

在下面的示例中,我们将展示如何使用 DirectoryStream 递归地遍历目录。

Main.java
List<Path> paths = new ArrayList<>();

List<Path> walk(Path path) throws IOException {

    try (DirectoryStream<Path> stream = Files.newDirectoryStream(path)) {

        for (Path entry : stream) {

            if (Files.isDirectory(entry)) {
                walk(entry);
            }

            paths.add(entry);
        }
    }

    return paths;
}

void main() throws IOException {

    var myPath = Paths.get("C:/Users/Jano/Downloads");
    var paths = walk(myPath);

    paths.forEach(System.out::println);
}

该示例递归地遍历目录。 它将所有条目收集到一个列表中并打印出来。 walk 方法接受一个 Path 对象作为参数,并返回一个 Path 对象列表,表示目录及其子目录中的条目。

来源

Java DirectoryStream - 语言参考

在本文中,我们使用了 Files.newDirectoryStream 来列出目录内容。

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 到目前为止,我已经撰写了超过 1,400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有Java教程