根据我读过的关于流等的许多教程,关闭不在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);
}
}
答案 0 :(得分:1)
如果流扩展FilterOutputStream
,则close()
方法首先调用flush()
,这可能会尝试某些I / O并遇到IOException
,这会被抛出致close()
的来电者。 BufferedOutputStream
是典型案例。
如果流扩展FilterOutputStream
并围绕另一个流,则在包装流上调用close()
调用close()
,其行为与上述相同。 new DataOutputStream(new BufferedOutputStream(...))
和new ObjectOutputStream(new BufferedOutputStream(...))
是典型案例。