您可以将关闭动作链接到流,如果发生
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(newFileInputStream(file)))问题代码的嵌套构造函数的行为,但通常情况下,应尽可能使用固定的字符集,例如
Files.lines默认的UTF-8。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)