【发布时间】:2015-03-18 20:34:25
【问题描述】:
在流教程中,没有提到关闭从Files.newInputStream( path ) 获得的流。只是有些晦涩:
返回的流是否可以异步关闭和/或 可中断是高度特定于文件系统提供程序的,因此 未指定。
在这种情况下,什么是“异步”?如果我明确关闭流或另一个线程异步关闭流?
【问题讨论】:
-
未关闭,它似乎为流提供的每个文件占用了一个文件描述符......这真的不是你可能想要处理大目录的。
在流教程中,没有提到关闭从Files.newInputStream( path ) 获得的流。只是有些晦涩:
返回的流是否可以异步关闭和/或 可中断是高度特定于文件系统提供程序的,因此 未指定。
在这种情况下,什么是“异步”?如果我明确关闭流或另一个线程异步关闭流?
【问题讨论】:
你必须关闭获得的InputStream,就像所有其他人一样。术语“异步关闭”是指在另一个线程在其上的 I/O 操作上被阻塞时关闭流的能力。
来自InterruptibleChannel 文档:
实现此接口的通道可异步关闭:如果线程在可中断通道上的 I/O 操作中被阻塞,则另一个线程可能会调用通道的关闭方法。这将导致被阻塞的线程接收到 AsynchronousCloseException。
【讨论】:
您可以使用新的资源尝试选项方便地做到这一点。
try(/*initialize resources here*/)
{
}
在 try 块之后它们将自动关闭。根据需要添加捕获。
【讨论】: