Java DirectoryStream
最后修改于 2025 年 6 月 26 日
在本文中,我们将演示如何使用 DirectoryStream
接口在 Java 中遍历目录。 这种方法高效且非常适合处理目录内容,而无需一次性将所有内容加载到内存中。
DirectoryStream
提供了一种灵活的方式来遍历目录中的条目。 它与增强的 for
循环无缝集成,使开发人员能够以干净且可读的方式迭代文件和子目录。
要获得 DirectoryStream
,请使用 Files.newDirectoryStream(Path dir)
方法。 此方法打开指定的目录并返回一个类似流的对象,该对象可用于一次访问每个条目。
DirectoryStream 列出主目录
第一个示例列出了用户的主目录。
Main.java
void main() throws IOException { var homeDir = Paths.get(System.getProperty("user.home")); try (var paths = Files.newDirectoryStream(homeDir)) { paths.forEach(System.out::println); } }
该示例列出了用户主目录的内容。
DirectoryStream Globbing 示例
我们可以对内容流应用简单的 Globbing 操作。 Files.newDirectoryStream
的第二个参数是 glob 模式。
Main.java
void main() throws IOException { var dirName = Paths.get("C:/Users/Jano/Downloads"); try (var paths = Files.newDirectoryStream(dirName, "*.pdf")) { paths.forEach(System.out::println); } }
该示例显示了指定目录中的所有 PDF 文件。
DirectoryStream 过滤器示例
可以使用 DirectoryStream.Filter
应用更复杂的过滤操作。
Main.java
void main() throws IOException { DirectoryStream.Filter<Path> filter = file -> 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(System.out::println); } }
该示例显示了所有小于 100 KB 的 JPEG 图像。
DirectoryStream 递归遍历
在下面的示例中,我们将展示如何使用 DirectoryStream
递归地遍历目录。
Main.java
List<Path> paths = new ArrayList<>(); 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; } void main() throws IOException { var myPath = Paths.get("C:/Users/Jano/Downloads"); var paths = walk(myPath); paths.forEach(System.out::println); }
该示例递归地遍历目录。 它将所有条目收集到一个列表中并打印出来。 walk
方法接受一个 Path
对象作为参数,并返回一个 Path
对象列表,表示目录及其子目录中的条目。
来源
在本文中,我们使用了 Files.newDirectoryStream
来列出目录内容。
作者
列出所有Java教程。