我是否必须在try-with-resources-block中关闭已终止的流式查询结果?

时间:2016-06-06 14:20:46

标签: java java-8 spring-data-jpa java-stream

在Spring Data JPA文档中它说的是关于流:

  

Stream可能会包装底层数据存储特定资源,因此必须在使用后关闭。您可以使用close()方法手动关闭Stream,也可以使用Java 7 try-with-resources块。

请参阅:http://docs.spring.io/spring-data/jpa/docs/1.10.1.RELEASE/reference/html/#repositories.query-streaming

如果我使用forEach,计数或其他终端操作处理流,它应该已经关闭(并且不能再次重复使用),我不必将流包装在其他try-resources中 - 块(假设我的块没有抛出任何异常),或者我错了吗?

1 个答案:

答案 0 :(得分:10)

Java APIs描述如下主题:

  

Streams有一个public void setActors(ArrayList<JiraActors> actors) { this.actors = actors; } 方法并实现BaseStream.close(),但几乎所有的流实例实际上都不需要在使用后关闭。通常,只有源为IO通道的流(例如AutoCloseable返回的流将需要关闭。大多数流由集合,数组或生成函数支持,不需要特殊的资源管理。要求关闭,可以在try-with-resources语句中将其声明为资源。)

另请注意Files.lines(Path, Charset))的API:

  

返回的流封装Files.lines(Path, Charset))如果需要及时处理文件系统资源,则应使用try-with-resources构造来确保在流操作之后调用流的Reader.方法完成了。

底线是:如果流对应的资源在正常情况下需要在使用后关闭(如IO),请在try-with-resources语句中使用它。