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

关闭Java 8流

苍志文
2023-03-14

如果我们使用Java8流,比如list。stream()。过滤器(..)。收集 该流何时关闭?

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

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

共有3个答案

郑晗日
2023-03-14

我必须补充一点,默认情况下,流根本不会关闭!

List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);

// "--" is not printed at all:
list.stream().onClose(()->System.out.println("--")).forEach(x -> System.out.println(x));

System.out.println("with try(){}:");

// "--" is printed:
try (Stream<Integer> stream = list.stream() ) {
    stream.onClose(() -> System.out.println("--")).forEach(x -> System.out.println(x));
}
戎高爽
2023-03-14

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

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

关闭不需要关闭的流没有成本;未能关闭需要关闭的流可能会导致严重问题。您是否确定您正在编写的代码(当前使用的是不需要关闭的数据流)永远不会被重新调整用途以使用不需要关闭的其他类型的数据流?

我刚刚完成了大量代码的重构,这些代码过去使用内存中的数据库,而不是SQL后端。所讨论的代码经常使用流,这是有充分理由的。将JDBC结果集封装在流中意味着我可以(我认为)非常容易地实现我的目标。但是我的新流封装了一个需要关闭的资源,而旧流没有。因为最初的开发人员(在本例中是我,我踢自己)没有关闭流,所以需要进行很多繁琐的调试。

酆高翰
2023-03-14

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

从流留档:

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

如果您需要关闭一个流,那么最佳实践是使用try-with资源语句:

try ( Stream<String> stream = Files.lines(path, charset) ) {
    // do something
}
 类似资料:
  • 我是java8的新手。 我有以下课程。 我能够保存这个在mongo收集: 现在,我得出了基于spring mongo数据存储库的结果。我想迭代上面的mongo集合,这样我只能得到我尝试过的以下车辆列表: 请帮助我了解java8。提前谢谢

  • 问题内容: 假设我有一个Java8 ,并且使用了该流,那么如何控制流中使用的s 的关闭? 请注意,我可能无权访问个人,例如: 在进行了其他一些映射等之后,我终于在续集中失去了。 我首先认为垃圾收集器可以在需要时执行此操作,但是当它很长时,我已经经历了OS描述符耗尽。 问题答案: 关于使用FileReader的一般注意事项:FileReader在内部使用FileInputStream,它会覆盖并且因

  • 嗨,我只知道这是一个古老的问题,但今天只是好奇。正如我们所知connection.close也会关闭preared语句(如果我错了请纠正我)。但是如果我关闭连接然后关闭preared语句会怎样 我会得到一个空指针异常吗? 有人说这取决于jvm的速度。有时,ps.close()会在conn.close完成其工作之前运行并首先关闭,因此您不会得到null指针。 为了测试它,我修改了代码 但是我没有得到

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

  • 问题内容: 我已经实现了 使用资源的自定义 java.util.Iterator ,该资源应在使用方法的最后释放。该资源可以是 java.sql.ResultSet , java.io.InputStream 等。 使用此迭代器的某些外部库可能不知道必须关闭它。例如: 在这种情况下,有没有办法关闭此迭代器? 更新: 非常感谢您提供当前的答案。我给每个人一个(+1)。当 hasNext() 返回fa

  • 问题内容: 今天,我第一次在本地计算机上启动Redis,然后在关闭Rails应用程序后关闭了所有终端窗口。一个小时后,我再次启动Rails应用程序,并执行以下操作来启动Redis服务器 但是,它告诉我 因此,即使关闭了Mac上的终端窗口,我也认为它仍在运行其较早的实例。 看着这个页面http://redis.io/commands/shutdown,我试图运行 在终端窗口中,但我收到此响应 因此,

  • 我对ExecutorService的javadoc#shutdown方法感到困惑。这些说法不矛盾吗? 启动有序关闭,其中执行以前提交的任务,但不接受新任务。此方法不会等待以前提交的任务完成执行。使用waitTersion执行此操作。 如果它能有序地关闭之前提交的任务,那么它怎么能等它们完成执行呢?

  • 我已经实现了HikariCP,它工作得很好,我现在计划优雅地关闭我的应用程序,我想让HikariCP正确地关闭数据库连接,而不仅仅是关闭java应用程序。我在谷歌上阅读,我可以看到HikariDataSource应该有一个封闭的方法。。。。但事实上,我看不到它的可用性: 在Eclipse中,如果我尝试ds。close()。。。Eclipse没有显示“close”作为HikariDataSource