我应该关闭用 java.nio.file.Files.newInputStream 创建的流吗?
Posted
技术标签:
【中文标题】我应该关闭用 java.nio.file.Files.newInputStream 创建的流吗?【英文标题】:Should I close Streams created with java.nio.file.Files.newInputStream? 【发布时间】:2015-03-18 20:34:25 【问题描述】:在流教程中,没有提到关闭从Files.newInputStream( path )
获得的流。只是有些晦涩:
返回的流是否可以异步关闭和/或 可中断是高度特定于文件系统提供程序的,因此 未指定。
在这种情况下,什么是“异步”?如果我明确关闭流或另一个线程异步关闭流?
【问题讨论】:
未关闭,它似乎为流提供的每个文件占用了一个文件描述符......这真的不是你可能想要处理大目录的。 【参考方案1】:你必须关闭获得的InputStream
,就像所有其他人一样。术语“异步关闭”是指在另一个线程在其上的 I/O 操作上被阻塞时关闭流的能力。
来自InterruptibleChannel
文档:
实现此接口的通道可异步关闭:如果线程在可中断通道上的 I/O 操作中被阻塞,则另一个线程可能会调用通道的关闭方法。这将导致被阻塞的线程接收到 AsynchronousCloseException。
【讨论】:
所以本教程的作者忘记了关闭流? docs.oracle.com/javase/tutorial/essential/io/… 没有。他们使用正确的自动资源管理习语。 这就是我想知道的,这个成语是什么,在哪里描述的?析构函数是否关闭了流?我似乎忽略了一个重要的部分。 在这里找到它:oracle.com/technetwork/articles/java/… 非常感谢!【参考方案2】:您可以使用新的资源尝试选项方便地做到这一点。
try(/*initialize resources here*/)
在 try 块之后它们将自动关闭。根据需要添加捕获。
【讨论】:
以上是关于我应该关闭用 java.nio.file.Files.newInputStream 创建的流吗?的主要内容,如果未能解决你的问题,请参考以下文章
我应该关闭用 java.nio.file.Files.newInputStream 创建的流吗?
我应该在 Windows 上为 C++ 使用哪个 IDE? [关闭]