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

流上的终端操作会关闭源吗?

左丘峰
2023-03-14
问题内容

考虑以下代码:

Path directory = Paths.get(/* some directory */);
Files.list(directory).forEach(System.out::println);

终端操作(如forEach)是否关闭已打开的基础文件?

请参阅Files.list的javadoc的相关部分:

返回的流封装了DirectoryStream。如果需要及时处理文件系统资源,则应使用try-with-
resources构造来确保在流操作完成之后调用流的close方法。

如果不调用Stream.close(),那么在生成可维护代码时最好的替代方法是什么?


问题答案:

终端操作员不会自动关闭流。考虑以下代码:

Stream<Path> list = Files.list(directory).onClose(() -> System.out.println("Closed"));
list.forEach(System.out::println);

这不会打印“已关闭”。

但是,以下内容确实显示“已关闭”:

try (Stream<Path> list = Files.list(directory).onClose(() -> System.out.println("Closed"))) {
    list.forEach(System.out::println);
}

因此,最好的方法是使用try-with-resources机制



 类似资料:
  • 考虑以下代码: 终端操作(如forEach)是否关闭已打开的底层文件? 请参阅文件javadoc的相关部分。列表: 返回的流封装了DirectoryStream。如果需要及时处理文件系统资源,则应使用try-with-resources构造来确保在流操作完成后调用流的close方法。 如果它不调用,那么在生成可维护代码时调用它的最佳替代方案是什么?

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

  • 问题内容: 下面的代码是否需要包装在try-with-resources中,以确保基础文件已关闭? 问题答案: 作为重载方法状态的javadoc 返回的流封装了。如果需要及时处理文件系统资源,则应使用该构造来确保在流操作完成之后调用流的close方法。 所以是的,在语句中包装返回的。(或适当关闭它。)

  • 方法是 现在我试着像这样改成stream,但我不知道这种改是否正确: 如何避免出现例外,解决问题? 我应该以某种方式重构代码吗?

  • 问: 为什么我关闭了终端,Workerman就自己关闭了? 答: Workerman有两种启动模式,debug调试模式和daemon守护进程模式。 运行 php xxx.php start 是进入debug调试模式,用于开发调试问题,当终端关闭后Workerman会随之关闭。 运行 php xxx.php start -d进入的是daemon守护进程模式,终端关闭不会影响Workerman。 如果

  • 问题内容: 我想知道是否有一种方法,通过单击“ X”,让程序在关闭JFrame之前执行一些代码。该方法仅使用整数。 问题答案: 您可能对使用感兴趣。本教程。