当前位置: 首页 > 面试题库 >

为什么发出终端操作后Java close()流不发送?

赵立果
2023-03-14
问题内容

阅读https://www.airpair.com/java/posts/spring-streams-memory-
efficiency后
,我很想将结果从数据库中流式传输,但是正如我与同事讨论的那样(他在评论中补充)文章),需要记住使用try-with-
resources构造以避免任何内存泄漏。

  1. 为什么Java 8库在每次终端操作后都不负责关闭流本身(而不必将流实例化包装在try-with-resources中)?
  2. 如果适用,是否有任何计划将此功能添加到Java中,或者请求它是否有意义?

问题答案:

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

我们将Stream设置为Autocloseable,以便您 可以 根据需要从源中释放资源,但这是我们停下来的原因,这是有充分的理由的。

这样做不仅会给大多数用户带来不必要的额外工作负担,而且还会违反总的原则:分配资源的人负责关闭资源。您打电话的时候

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

是一个开放的资源,而不是流库,并且
应该关闭它。实际上,由于关闭由于在某个资源持有对象上调用访问器方法而导致的流有时会关闭基础对象,因此您可能不希望该流BufferedReader为您关闭-
您可能希望在调用后使其保持打开状态。

如果要关闭资源,这也很容易:

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

您可能以特定的方式使用流,因此流应该做什么似乎“很明显”-但是有比您更多的用例。因此,我们不遵循特定的用例,而是从一般原则着手进行处理:如果您打开了流,并且想要关闭它,请自己关闭它,但是如果您不打开它,则不是您要关闭它。



 类似资料:
  • 阅读后https://www.airpair.com/java/posts/spring-streams-memory-efficiency,我很想从数据库中导出结果,但正如我与一位同事讨论的那样(他在那篇文章中添加了cfr注释),需要记住使用try with resources构造来避免任何内存泄漏。 为什么Java 8库不负责在每次终端操作后关闭流本身(而不必将流实例化包装在资源试用中)

  • 问题内容: 有人可以告诉我中间操作和终端操作有什么区别吗? 操作组合到管道中以处理流。所有操作都是中间操作或终端..means?。 问题答案: Stream支持几种操作,这些操作分为和操作。 此操作之间的区别在于,中间操作是惰性的,而终端操作不是。当您在流上调用中间操作时,该操作不会立即执行。仅在对该流调用终端操作时才执行该命令。在某种程度上,一旦调用了终端操作,便会存储并调用一次中间操作。您可以

  • 如果一个中间操作消耗了流的一些元素,之后使用了peek(),但没有终端操作,那么peek()是否还应该产生一些输出呢?

  • 我试图理解是什么保存了对对象的引用,使得它们在执行Java流终端操作时不符合垃圾收集的条件? 这是我的测试代码 从未调用LargetObject的finalize方法。 我的想法是一旦. map(largeObject- 为什么这不会发生?也许真的可以做些什么?

  • 问题内容: 我创建了两个实体并且具有一对多关系。当我发出时,我希望hibernate状态使用“ INNER JOIN”查询。但是它只是发出查询以从Book_Category获取数据。 我缺少什么?我该怎么做使hibernate问题的JOIN查询? Book.java BookCategory.java BookCategoryRepository.java 问题答案: 默认情况下,Hibernat

  • 我创建了两个具有一对多关系的实体和。当我发布,我希望hibernate使用“内部联接”查询。但它只是发出了从Book_类别获取数据的查询。 我错过了什么?我应该怎么做才能使hibernate问题加入查询? 书JAVA 图书分类。JAVA epository.java