Java DirectoryStream 教程显示了如何使用 DirectoryStream 遍历目录。
DirectoryStream
是要遍历目录中条目的对象。 目录流允许方便地使用 for-each 构造来遍历目录。
Files.newDirectoryStream
打开目录,返回DirectoryStream
以遍历目录中的所有条目。
Java DirectoryStream
示例
第一个示例列出了当前目录。
DirectoryStreamEx.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
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
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
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()
列出目录内容。