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

时间:2015-11-12 19:44:42

标签: java io stream

根据我读过的关于流等的许多教程,关闭不在try-block内部的Stream被认为是一种好习惯,但最后在finally内部,以确保它在有和没有异常的情况下关闭。< / p>

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

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);
    }
}

1 个答案:

答案 0 :(得分:1)

  • 如果流扩展FilterOutputStream,则close()方法首先调用flush(),这可能会尝试某些I / O并遇到IOException,这会被抛出致close()的来电者。 BufferedOutputStream是典型案例。

  • 如果流扩展FilterOutputStream并围绕另一个流,则在包装流上调用close()调用close(),其行为与上述相同。 new DataOutputStream(new BufferedOutputStream(...))new ObjectOutputStream(new BufferedOutputStream(...))是典型案例。