在流 API 中使用自动关闭接口
2022-09-04 01:41:45
今天,我试图重构这段代码,从目录中的文件读取ID,
Set<Long> ids = new HashSet<>();
for (String fileName : fileSystem.list("my-directory")) {
InputStream stream = fileSystem.openInputStream(fileName);
BufferedReader br = new BufferedReader(new InputStreamReader(stream));
String line;
while ((line = br.readLine()) != null) {
ids.add(Long.valueOf(line.trim()));
}
br.close();
}
使用流 API
Set<Long> ids = fileSystem.list("my-directory").stream()
.map(fileName -> fileSystem::openInputStream)
.map(is -> new BufferedReader(new InputStreamReader(is)))
.flatMap(BufferedReader::lines)
.map(String::trim)
.map(Long::valueOf)
.collect(Collectors.toSet());
然后我发现IO流不会被关闭,我没有看到关闭它们的简单方法,因为它们是在管道内创建的。
有什么想法吗?
更新:FileSystem的例子是HDFS,类似的方法不能使用。Files#lines