在什么情况下关闭流会失败?

Under what circumstances could closing a stream fail?

根据我读过的关于流等的许多教程,关闭 Stream 不在 try 块内而是在 finally 内被认为是一种很好的做法,以确保它在有无异常的情况下关闭.

当然,这必须再次被 try-and-catch 包围,因为 .close() 可以抛出 IOException。但是,由于 Javadoc 关于在什么条件下可能发生这种情况 ("Throws: IOException - if an I/O error occurs.") 非常模糊,我想知道具体来说,要在这个地方抛出这个异常会发生什么。下面是一个示例代码。


FileInputStream fis = null;
try {
    fis = new FileInputStream("C:\TestFiles\JapaneseFileNames");
    // Do some stuff
} catch (IOException e) {
    e.printStackTrace();
} finally {
    try {
        if(fis != null) {
            fis.close();
        }
    } catch(IOException e) {
        throw new RuntimeException("Something happened, but what?", e);
    }
}
  • 如果流扩展 FilterOutputStreamclose() 方法首先调用 flush(),它可能会尝试一些 I/O 并遇到 IOException,抛给close()的调用者。 BufferedOutputStream是典型案例。

  • 如果流扩展 FilterOutputStream 并包裹在另一个流上,调用 close() 会在包裹的流上调用 close(),其行为如上。 new DataOutputStream(new BufferedOutputStream(...))new ObjectOutputStream(new BufferedOutputStream(...))是典型案例。