您可以将关闭动作链接到流,如果发生flatMap
以下情况,该动作将自动执行:
Stream.generate(localFileProvider::getNextFile).takeWhile(Objects::nonNull)
.flatMap(file -> {
try {
Path p = file.toPath();
return Files.lines(p, Charset.defaultCharset()).onClose(() -> {
try { // move path/x/y/z to path/x/y/z.moved
Files.move(p, p.resolveSibling(p.getFileName()+".moved"));
} catch(IOException ex) { throw new UncheckedioException(ex); }
});
} catch(IOException ex) { throw new UncheckedioException(ex); }
})
.forEach(System.out::println);
状态文档onClose
很重要:
当在close()
流上调用该方法时,将运行关闭处理程序,并按添加顺序执行。
因此,在已经存在的关闭处理程序之后执行移动关闭处理程序,该关闭处理程序将关闭用于读取行的文件句柄。
我曾经Charset.defaultCharset()
模仿new InputStreamReader(new FileInputStream(file)))
问题代码的嵌套构造函数的行为,但通常情况下,应尽可能使用固定的字符集,例如Files.lines
默认的UTF-8。