Java 流上的collect操作是否关闭流和底层资源?

Java 流上的collect操作是否关闭流和底层资源?,java,file-io,java-8,java-stream,try-with-resources,Java,File Io,Java 8,Java Stream,Try With Resources,下面的代码是否需要包装在try-with-resources中以确保底层文件已关闭 List<String> rows = Files.lines(inputFilePath).collect(Collectors.toList()); List rows=Files.lines(inputFilePath.collect(Collectors.toList()); 正如重载方法的javadoc所述 返回的流封装了读取器。如果及时处理文件 系统资源是必需的,try with res

下面的代码是否需要包装在try-with-resources中以确保底层文件已关闭

List<String> rows = Files.lines(inputFilePath).collect(Collectors.toList());
List rows=Files.lines(inputFilePath.collect(Collectors.toList());

正如重载方法的javadoc所述

返回的流封装了
读取器
。如果及时处理文件 系统资源是必需的,
try with resources
构造应该 用于确保流的close方法在 流操作已完成


因此,是的,将
返回的
封装在
try with resources
语句中。(或者适当地)有一个技巧可以使
实现在终端操作后调用
close()

List<String> rows = Stream.of(Files.lines(inputFilePath)).flatMap(s->s)
                   .collect(Collectors.toList());

读取所有行并关闭所有资源…

Stream and close()的设计非常有争议。为了安全起见,如果您不确定,请始终关闭流。即使这可能还不够,看,我试过你的解决方案,它是有效的。我还假设它相当于
Files.lines(inputFilePath).flatMap(Stream::of)
,但令我惊讶的是,它不是。后者实际上并没有关闭河流。(在jdk1.8.0_221上)@neXus
.flatMap(Stream::of)
为每个元素创建一个新的单个元素流,并将它们展平为与flatMap相同的流。这些单元素流将被关闭,但这没有任何效果。
List<String> rows = Files.readAllLines(inputFilePath);