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 扩展名结尾。
来源
在本文中,我们使用 Files.walk 遍历目录内容。
作者
列出所有Java教程。