根据我读过的许多关于流等的教程,关闭流而不是在try-block内部,而是在final内部关闭被认为是很好的做法,以确保它关闭有和没有例外。
当然,这必须再次被尝试和捕获所包围,因为 .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);
}
}
-
如果流
FilterOutputStream
扩展,close()
方法首先调用flush()
,它可能会尝试一些I/O并遇到一个IOException
,该被抛出给close()
的调用者。BufferedOutputStream
是典型的情况。 -
如果流
FilterOutputStream
扩展并环绕在另一个流上,则调用close()
调用close()
包装的流,其行为如上所述。new DataOutputStream(new BufferedOutputStream(...))
和new ObjectOutputStream(new BufferedOutputStream(...))
是典型的案例。