在什么情况下关闭流会失败?
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);
}
}
如果流扩展 FilterOutputStream
,close()
方法首先调用 flush()
,它可能会尝试一些 I/O 并遇到 IOException
,抛给close()
的调用者。 BufferedOutputStream
是典型案例。
如果流扩展 FilterOutputStream
并包裹在另一个流上,调用 close()
会在包裹的流上调用 close()
,其行为如上。 new DataOutputStream(new BufferedOutputStream(...))
和new ObjectOutputStream(new BufferedOutputStream(...))
是典型案例。
根据我读过的关于流等的许多教程,关闭 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);
}
}
如果流扩展
FilterOutputStream
,close()
方法首先调用flush()
,它可能会尝试一些 I/O 并遇到IOException
,抛给close()
的调用者。BufferedOutputStream
是典型案例。如果流扩展
FilterOutputStream
并包裹在另一个流上,调用close()
会在包裹的流上调用close()
,其行为如上。new DataOutputStream(new BufferedOutputStream(...))
和new ObjectOutputStream(new BufferedOutputStream(...))
是典型案例。