当前位置: 首页 > 知识库问答 >
问题:

做这条流。spliterator()关闭流?

庄浩言
2023-03-14

执行<代码>流。spliterator()隐式关闭流,还是需要在之后显式关闭?

Stream<String> stream = Stream.of("a", "b", "c");
Spliterator<T> spliterator = stream.spliterator();
// Some low lever operation with the spliterator
stream.close(); // do we need to close?

乍一看,似乎是<代码>。spliterator()方法关闭流,但不调用流。close()。至少如果我在<代码>之后立即关闭它。调用spliterator()方法,似乎不会影响spliterator操作。

Stream<String> stream = Stream.of("a", "b", "c").limit(2);
Spliterator<T> spliterator = stream.spliterator();
stream.close();
// Some low lever operation with the spliterator

这个问题可以扩展到其他流方法,例如。findAny()

stream.findAny() // Can I assume that I don't need to close the stream?
stream.onClose(() -> System.out.println("hi!")).findAny()`
// when the `onClose()` action will be called?

这个问题的原因是为了非常清楚何时需要显式关闭,以及在不需要显式关闭它的情况下,何时将发生onBack()定义的操作?

共有3个答案

岑毅庵
2023-03-14

pliterator()方法的调用返回此流的元素及其终端操作的Spliterator

回答您的问题-不,spliterator方法或者出于这个原因,任何其他终端操作都不会关闭流。

这在码头操作中记录为-

执行终端操作后,流管道被视为已消耗,无法再使用。。。。在几乎所有情况下,终端操作都是急切的,在返回之前完成对数据源的遍历和对管道的处理。只有终端操作迭代器()和拆分器()不是;它们作为“逃生舱口”提供,以在现有操作不足以完成任务的情况下启用任意客户端控制的管道遍历。

另一方面,文档声明:-

大多数流实例在使用后实际上不需要关闭,因为它们由集合、数组或生成函数支持,不需要特殊的资源管理。通常,只有源是IO通道的流,例如由文件返回的流。行(路径),将需要关闭。

自动关闭的状态与之匹配-

基类实现AutoCloseable是可能的,事实上也是常见的,即使不是所有的子类或实例都包含可释放的资源。

这就是基流扩展它的方式,close()对使用资源(如文件)的流的影响不会远大于流。行(…)

然而,当使用支持基于I/O和非基于I/O的表单的流等设施时,在使用非基于I/O的表单时,通常不需要使用资源块。

段干长恨
2023-03-14

在Java9中关闭Stream没有任何变化。如果应该释放底层资源,您仍然需要手动执行此操作。您永远不应该依赖垃圾收集器来执行此操作。文档仍然说:

流有一个BaseStream.close()方法并实现AutoCloseable。在流被关闭后对其进行操作将抛出IllegalStateException。大多数流实例在使用后实际上不需要关闭,因为它们由集合、数组或生成函数支持,这些函数不需要特殊的资源管理。通常,只有源是IO通道的流,例如由Files.lines(Path)返回的流,才需要关闭。如果流确实需要关闭,则必须在try-with资源语句或类似的控制结构中将其作为资源打开,以确保在其操作完成后立即关闭。

苏健柏
2023-03-14

终端操作永远不会关闭流。关闭必须手动完成。自动关闭发生的唯一地方是在平面地图操作中,手动关闭通常动态创建的子流将是困难和不可能的。

这也适用于Stream.spliterator()方法。在您的示例中,它没有区别,因为通过Stream.of(...)创建的流不需要关闭,并且默认情况下没有注册onCloch()操作。

您必须查看工厂方法的留档,以确定何时需要关闭流。例如,Files#line(Path, Charset)

请参阅流上的收集操作是否关闭流和底层资源?或者Java 8流。迭代器()完成后自动关闭流?

 类似资料:
  • 问题内容: 如果我们使用Java 8 Stream,例如何时关闭此流? 作为下一个示例,我们关闭流是不是一个好习惯? 问题答案: 通常根本不需要关闭流。您只需要关闭使用IO资源的流。 从Stream文档中: 流具有方法和实现,但是实际上几乎所有流实例在使用后都不需要关闭。通常,只有源是IO通道的流(例如由返回的)才需要关闭。大多数流都由集合,数组或生成函数支持,而无需特殊的资源管理。(如果流确实需

  • 如果我们使用Java8流,比如

  • 我想使用stream getfirst方法两次,但是出现了一个错误,即(java.lang.IllegalStateException:stream已经被操作或关闭),并且这个流代码以此处命名的注释开始。

  • 我正在尝试读取文件中的一行,在喷口中,然后将其发送到螺栓,但我一直收到流关闭错误。我关闭错误还是这里有什么问题? 这是我遇到的错误: Java语言io。IOException:溪流在周日关闭。nio。反恐精英。StreamDecoder。ensureOpen(StreamDecoder.java:46)在sun上。nio。反恐精英。StreamDecoder。在java上读取(StreamDeco

  • 问题内容: 我想知道如果不手动关闭流,何时关闭。我的意思是,如果引用的范围不再存在,流将被关闭吗? 请考虑以下示例方案。 在这里,一旦完成流处理,我将退出,但是反过来将继续执行该程序的程序不会终止,而是继续进行其他操作。 我没有关闭溪流。一旦对A类的引用范围结束,它会自动关闭吗?(即何时结束)?GC会照顾吗?另外,我读到,一旦流程结束,流将关闭,并且系统释放为其他进程保留的所有资源。我们如何检查流

  • 问题内容: 这是我目前拥有的代码: 一切都会按预期进行(调用writeToFile方法时将文件写入)。但是,当第二次调用writeToFile方法时,出现以下错误: 该文件仍按预期第二次写入,但是它将在第二次以及以后对writeToFile()的调用中引发此错误。我想知道是什么导致此错误发生。 问题答案: 写完后就在打电话。流关闭后,将无法再次写入。通常,实现此目标的方法是将结束状态移至write