ZetCode

Java Files.walk

最后修改于 2024 年 7 月 7 日

在本文中,我们将展示如何使用 Java 中的 Files.walk 遍历文件。

Files.walk 返回一个流,该流通过递归遍历以给定起始文件为根的文件树来延迟填充 Path。文件树以深度优先的方式遍历。有两个重载的 Files.walk 方法;其中一个接受 maxDepth 参数,该参数设置要访问的最大目录级别数。

默认情况下,此方法不会自动跟随符号链接。如果 options 参数包含 FOLLOW_LINKS 选项,则会跟随符号链接。

遍历常规文件

第一个示例显示指定目录中的常规文件。

Main.java
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;

void main() throws IOException {

    var dirName = "C:/Users/Jano/Downloads";

    try (Stream<Path> paths = Files.walk(Paths.get(dirName), 2)) {
        paths.filter(Files::isRegularFile)
                .forEach(System.out::println);
    }
}

该程序遍历目录两层。我们使用 Files.isRegular 谓词应用过滤器。

遍历目录

以下示例显示指定目录中的目录。

Main.java
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;

void main() throws IOException {

    var dirName = "C:/Users/Jano/Downloads";

    try (Stream<Path> paths = Files.walk(Paths.get(dirName))) {
        paths.filter(Files::isDirectory)
                .forEach(System.out::println);
    }
}

要输出目录,我们应用 Files.isDirectory 谓词。这次没有递归遍历的限制。

按文件扩展名遍历

下一个程序列出指定目录及其子目录中所有两层以内的 PDF 文件。

Main.java
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;

void main() throws IOException {

    var dirName = "C:/Users/Jano/Downloads";

    try (Stream<Path> paths = Files.walk(Paths.get(dirName), 2)) {
        paths.map(path -> path.toString()).filter(f -> f.endsWith(".pdf"))
                .forEach(System.out::println);
    }
}

该程序列出 Downloads 目录中的 PDF 文件。path 对象被转换为字符串,我们调用字符串上的 endsWith 来检查它是否以 pdf 扩展名结尾。

来源

Java 基础 I/O - 教程

在本文中,我们使用 Files.walk 遍历目录内容。

作者

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

列出所有Java教程