关闭 Java 8 流

新手上路,请多包涵

如果我们像 list.stream().filter(....).collect(..)..... 一样使用 Java 8 Stream — 它什么时候关闭这个流?

作为下一个示例,我们关闭流 us 是一种好的做法吗?

 Stream<String> stream = list.stream();
String result = stream.limit(10).collect(Collectors.joining(""));
stream.close();

原文由 Pau 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

通常根本不需要关闭流。您只需要关闭使用 IO 资源的流。

来自 Stream 文档

流有一个 BaseStream.close() 方法和实现 AutoCloseable ,但几乎所有的流实例实际上并不需要在使用后关闭。通常,只有源为 IO 通道的流(例如 Files.lines(Path, Charset) 返回的流)才需要关闭。大多数流由集合、数组或生成函数支持,不需要特殊的资源管理。 (如果流确实需要关闭,则可以在 try-with-resources 语句中将其声明为资源。)

如果 您需要关闭流,那么最佳做法是使用 try-with-resources 语句:

 try ( Stream<String> stream = Files.lines(path, charset) ) {
    // do something
}

原文由 kapex 发布,翻译遵循 CC BY-SA 4.0 许可协议

当然,默认情况下你应该关闭一个流。

流是一种非常通用的 API;关键在于它代表了一个数据流, 而不 需要数据的消费者了解数据的来源。

关闭不需要关闭的流没有成本;未能关闭需要关闭的流可能会导致严重的问题。您如何确定您正在编写的代码(当前使用不需要关闭的数据流) 永远不会 被重新用于使用需要关闭的不同类型的流?

我刚刚重构了大量代码,这些代码过去使用内存数据库,改为使用 SQL 后端。有问题的代码大量使用流,这是有充分理由的。将 JDBC 结果集封装在一个流中意味着我可以(……我认为)很容易地实现我的目标。但是……我的新流封装了一个需要关闭的资源,而旧流则没有。因为原始开发人员(在这种情况下是我,我在踢自己)没有关闭流,所以需要进行大量繁琐的调试。

原文由 Jonathan Essex 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏