# Java `Files.walk`教程

原文：http://zetcode.com/java/fileswalk/

Java `Files.walk`教程显示了如何使用`Files.walk`在 Java 中遍历文件。

`Files.walk`通过递归遍历以给定起始文件为根的文件树来返回由`Path`延迟填充的流。 文件树是深度优先遍历的。 有两种重载的`Files.walk`方法； 其中之一采用`maxDepth`参数，该参数设置要访问的最大目录级别数。

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

## `Files.walk`常规文件

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

`FilesWalkRegularFilesEx.java`

```java
package com.zetcode;

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

public class FilesWalkRegularFilesEx {

    public static void main(String[] args) 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()`谓词的过滤器。

## `Files.walk`目录

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

`FilesWalkDirectoriesEx.java`

```java
package com.zetcode;

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

public class FilesWalkDirectoriesEx {

    public static void main(String[] args) 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()`谓词。 这次没有递归遍历的限制。

## `Files.walk`按文件扩展名

下一个程序列出了指定目录和其子目录中两个级别的所有 PDF 文件。

`FilesWalkFileExtensionEx.java`

```java
package com.zetcode;

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

public class FilesWalkFileExtensionEx {

    public static void main(String[] args) 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 文件。 路径对象被转换为字符串，我们在字符串上调用`endsWith()`以检查其是否以`pdf`扩展名结尾。

在本教程中，我们使用`Files.walk`遍历目录内容。 您可能也对相关教程感兴趣： [Java `Files.list`教程](/java/fileslist/)， [Java `Files.walk`教程](/java/fileswalk/)， [Java `DirectoryStream`教程](/java/directorystream/)， [Java 文件教程](/java/file/) ， [Java 创建目录](/java/createdirectory/)，[用 Java 复制文件](/java/copyfile/)， [Java `ProcessBuilder`教程](/java/processbuilder/)，[用 Java 创建文件](/java/createfile/)和 [Java 教程](/lang/java/)。