Java 以流的形式检索文件,用户希望将目录中的所有文件作为 Stream
进行处理,使用 java.nio.file.Files
类定义的静态方法 list
。list
方法传入 Path
作为参数,并返回一个包装 DirectoryStream
4 的 Stream
。
Java 以流的形式检索文件 问题描述
用户希望将目录中的所有文件作为 Stream
进行处理。
Java 以流的形式检索文件 解决方案
使用 java.nio.file.Files
类定义的静态方法 list
。
Java 以流的形式检索文件 具体实例
list
方法传入 Path
作为参数,并返回一个包装 DirectoryStream
4 的 Stream
。由于 DirectoryStream
接口继承自 AutoCloseable
,try-with-resources
构造是使用 list
方法的最佳方式,如例 7-6 所示。
4这是一个 IO 流而非函数式流。
例 7-6
Files.list(path)
方法的应用
try (Stream<Path> list = Files.list(Paths.get("src/main/java"))) {
list.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
如果在具有标准 Maven 或 Gradle 结构的项目根目录下执行上述代码,程序将打印 src/ main/java 目录中所有文件和文件夹的名称。使用 try-with-resources
代码块,当 try
代码块执行完毕后,系统将在 Stream
上调用 close
方法,然后在底层 DirectoryStream
上调用 close
方法。请注意,目录和文件不是递归的。
执行本书配套的源代码(例 7-6),程序将输出目录和单个文件:
src/main/java/collectors
src/main/java/concurrency
src/main/java/datetime
...
src/main/java/Summarizing.java
src/main/java/tasks
src/main/java/UseFilenameFilter.java
list
方法的签名如下,其返回类型为 Stream<Path>
,参数为目录的路径:
public static Stream<Path> list(Path dir) throws IOException
请注意,对非目录资源执行 list
方法将抛出 NotDirectoryException
。
Javadoc 指出,list
方法返回的流具备弱一致性(weak consistency)。换言之,“流是线程安全的,但在迭代时不会冻结目录,因此它可能会(也可能不会)反映 list
方法返回后所发生的目录更新”。