# Java `DirectoryStream`教程

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

Java `DirectoryStream`教程显示了如何使用`DirectoryStream`遍历目录。

`DirectoryStream`是要遍历目录中条目的对象。 目录流允许方便地使用`for-each`构造来遍历目录。

`Files.newDirectoryStream`打开目录，返回`DirectoryStream`以遍历目录中的所有条目。

## Java `DirectoryStream`示例

第一个示例列出了当前目录。

`DirectoryStreamEx.java`

```java
package com.zetcode;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

public class DirectoryStreamEx {

    public static void main(String[] args) throws IOException {

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

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

            paths.forEach(path -> System.out.println(path));
        }
    }
}

```

该示例列出了指定目录的内容。

## Java `DirectoryStream`遍历示例

我们可以对内容流应用简单的遍历操作。 `Files.newDirectoryStream()`的第二个参数是球形图案。

`DirectoryStreamGlobEx.java`

```java
package com.zetcode;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

public class DirectoryStreamGlobEx {

    public static void main(String[] args) throws IOException {

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

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

            paths.forEach(path -> System.out.println(path));
        }
    }
}

```

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

## Java `DirectoryStream`过滤器示例

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

`DirectoryStreamFilterEx.java`

```java
package com.zetcode;

import java.io.IOException;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class DirectoryStreamFilterEx {

    public static void main(String[] args) throws IOException {

        DirectoryStream.Filter<Path> filter = file -> {
            return 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(path -> System.out.println(path));
        }
    }
}

```

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

## Java `DirectoryStream`递归遍历

在下面的示例中，我们显示如何使用`DirectoryStream`递归遍历目录。

`DirectoryStreamRecursiveEx.java`

```java
package com.zetcode;

import java.io.IOException;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

public class DirectoryStreamRecursiveEx {

    private static List<Path> paths = new ArrayList<>();

    private static 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;
    }

    public static void main(String[] args) throws IOException {

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

        var paths = walk(myPath);

        paths.forEach(path -> System.out.println(path));
    }
}

```

该示例以递归方式遍历目录。

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