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

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

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

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

Java DirectoryStream示例

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

DirectoryStreamEx.java

  1. package com.zetcode;
  2. import java.io.IOException;
  3. import java.nio.file.Files;
  4. import java.nio.file.Paths;
  5. public class DirectoryStreamEx {
  6. public static void main(String[] args) throws IOException {
  7. var dirName = Paths.get("C:/Users/Jano/Downloads");
  8. try (var paths = Files.newDirectoryStream(dirName)) {
  9. paths.forEach(path -> System.out.println(path));
  10. }
  11. }
  12. }

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

Java DirectoryStream遍历示例

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

DirectoryStreamGlobEx.java

  1. package com.zetcode;
  2. import java.io.IOException;
  3. import java.nio.file.Files;
  4. import java.nio.file.Paths;
  5. public class DirectoryStreamGlobEx {
  6. public static void main(String[] args) throws IOException {
  7. var dirName = Paths.get("C:/Users/Jano/Downloads");
  8. try (var paths = Files.newDirectoryStream(dirName, "*.pdf")) {
  9. paths.forEach(path -> System.out.println(path));
  10. }
  11. }
  12. }

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

Java DirectoryStream过滤器示例

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

DirectoryStreamFilterEx.java

  1. package com.zetcode;
  2. import java.io.IOException;
  3. import java.nio.file.DirectoryStream;
  4. import java.nio.file.Files;
  5. import java.nio.file.Path;
  6. import java.nio.file.Paths;
  7. public class DirectoryStreamFilterEx {
  8. public static void main(String[] args) throws IOException {
  9. DirectoryStream.Filter<Path> filter = file -> {
  10. return Files.size(file) < 100_000L && file.toString().endsWith(".jpg");
  11. };
  12. var dirName = Paths.get("C:/Users/Jano/Downloads");
  13. try (var paths = Files.newDirectoryStream(dirName, filter)) {
  14. paths.forEach(path -> System.out.println(path));
  15. }
  16. }
  17. }

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

Java DirectoryStream递归遍历

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

DirectoryStreamRecursiveEx.java

  1. package com.zetcode;
  2. import java.io.IOException;
  3. import java.nio.file.DirectoryStream;
  4. import java.nio.file.Files;
  5. import java.nio.file.Path;
  6. import java.nio.file.Paths;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. public class DirectoryStreamRecursiveEx {
  10. private static List<Path> paths = new ArrayList<>();
  11. private static List<Path> walk(Path path) throws IOException {
  12. try (DirectoryStream<Path> stream = Files.newDirectoryStream(path)) {
  13. for (Path entry : stream) {
  14. if (Files.isDirectory(entry)) {
  15. walk(entry);
  16. }
  17. paths.add(entry);
  18. }
  19. }
  20. return paths;
  21. }
  22. public static void main(String[] args) throws IOException {
  23. var myPath = Paths.get("C:/Users/Jano/Downloads");
  24. var paths = walk(myPath);
  25. paths.forEach(path -> System.out.println(path));
  26. }
  27. }

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

在本教程中,我们使用Files.newDirectoryStream()列出目录内容。 您可能也对相关教程感兴趣。 Java 文件教程Java 创建目录用 Java 复制文件Java DirectoryStream教程Java Files.walk教程Java Files.list教程用 Java 创建文件Java 教程