我应该关闭用 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 创建的流吗?

物体应该自己画吗? (几何和纹理的混合)[关闭]

我应该使用 GTK 或 QT [关闭]

我应该在 Windows 上为 C++ 使用哪个 IDE? [关闭]

我应该知道今天使用 Swift 的 Objective-C [关闭]

当分布中有异常值时,我应该如何使用 `mean` 函数? [关闭]