gpt4 book ai didi

java - 为什么发出终端操作后 Java close() 不流式传输?

转载 作者:IT老高 更新时间:2023-10-28 20:52:21 26 4
gpt4 key购买 nike

看完https://www.airpair.com/java/posts/spring-streams-memory-efficiency ,我很想将结果从数据库中流出,但正如我与一位同事讨论的那样(cfr. 他在该文章中添加的评论),需要记住使用 try-with-resources 构造来避免任何内存泄漏。

  1. 为什么 Java 8 库在每个 terminal operation 之后不自行关闭流? (无需将流实例包装在 try-with-resources 中)?
  2. 如果适用,是否有将此功能添加到 Java 的任何计划,或者请求它是否有意义?

最佳答案

因为需要显式资源释放的流实际上是一种非常不寻常的情况。因此,我们选择不使用仅对 0.01% 的使用有值(value)的东西来负担所有流执行。

我们制作了 Stream Autocloseable,以便您可以根据需要从源中释放资源,但这就是我们停止的地方,并且有充分的理由。

这样做不仅会自动给大多数用户带来他们不需要的额外工作,而且还会违反一般原则:分配资源的人负责关闭资源。当你打电话时

BufferedReader reader = ...
reader.lines().op().op()...

是打开资源的人,而不是流库,应该关闭它。事实上,由于在某些资源持有对象上调用访问器方法而关闭流有时会关闭底层对象,因此您可能不希望流为您关闭 BufferedReader - 您可能希望它在通话后保持打开状态。

如果你想关闭资源,这也很简单:

try (BufferedReader reader = ...) {
reader.lines().op()...
}

您可能正在以一种特定的方式使用流,因此流应该做什么似乎“显而易见”——但那里的用例比您的要多。因此,我们没有迎合特定用例,而是从一般原则着手:如果您打开了流,并且想要关闭它,请自己关闭它,但如果您没有打开它,则不适合您关闭。

关于java - 为什么发出终端操作后 Java close() 不流式传输?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28813637/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com