如何关闭java.util.Stream并使用终端操作

jon*_*son -1 java java-stream

如果我有一个java.util.Stream需要关闭的(一旦完成),我如何才能既关闭它(通过调用close)又调用一个终端操作,如countor collect

例如:

java.nio.file.Files.lines(FileSystems.getDefault().getPath("myfile.txt"))
        .collect(Collectors.toSet());
        //.close(); ???
Run Code Online (Sandbox Code Playgroud)

(在此示例中,调用close并不重要,但可以说我有一个Stream对象,该对象通过onClose在流中注册了关键的close操作)。

我猜您可以将流存储在temp var中并关闭它,如下所示:

Stream<String> ss = java.nio.file.Files.lines(FileSystems.getDefault().getPath("myfile.txt"));
Set<String> lines = ss.collect(Collectors.toSet());
ss.close();
return lines;
Run Code Online (Sandbox Code Playgroud)

但似乎有点笨拙。以这种方式关闭流是否总是安全的?

tev*_*dar 5

参见文档。

8

如果需要及时处理文件系统资源,则应使用try-with-resources构造来确保在流操作完成之后调用流的close方法。

12

必须在try-with-resources语句或类似的控制结构中使用此方法,以确保在流的操作完成后立即关闭流的打开文件。

我认为您可能要考虑使用try-with-resources构造。特别是随着当前的发展成为“必须”。