Java 我应该使用方法close还是close安静地关闭输出流?
当我们需要关闭输出流时,我们有两种选择Java 我应该使用方法close还是close安静地关闭输出流?,java,outputstream,Java,Outputstream,当我们需要关闭输出流时,我们有两种选择 “关闭”是指关闭一条小溪,无一例外地呕吐 try { close(out) } catch(IOException e) { } 接近 try { close(out) } catch(IOException e) { throw anException; } 众所周知,关闭时,输出流会在文件末尾写入一个/多个字符,如果这些写入错误,文件也无法正确打开,例如ZipoutStream 如果我使用第一个,我将有失败关闭的风险。
try {
close(out)
} catch(IOException e) {
}
try {
close(out)
} catch(IOException e) {
throw anException;
}
谢谢你的回答。特别感谢@Don Roby为我提供了一个链接,其中包含了@Fabian Barney回答的最佳答案,因为Java 7
IOUtils.Closequity
已经过时,唯一合理的解决方案是尝试使用资源
自动关闭资源
try (InputStream is = new FileInputStream(file)) {
...
}
请注意,它还解决了正确打开/关闭多个资源的问题
try (InputStream is = new FileInputStream(infile); OutputStream out = new FileOutputStream(outfile)) {
...
}
而且它也不会抑制
close()
可能抛出的IOException,这正是closequilly
所做的。一些close()
的实现可能包括其他逻辑,如写入最终字节或flush()
。示例是FilterOutputStream
现在想象一个基于网络通道或外部USB驱动器的流的情况。两者随时都可能消失。执行close()时可能会发生这种情况
所以我的观点是:捕获IOException并抛出特定于应用程序的异常,包括原因异常,如:
} catch (IOException e)
{
throw new IOManagementException(e);
}
若您坚持不抛出异常,那个么至少用错误状态记录If
如果不这样做,可能会导致很难分析错误报告或奇怪的行为。根据经验,我从不接受异常,因此根据我编写的代码所需的逻辑,我可能会
try {
close(out);
} catch(IOException e) {
// log the exception
log.info("An error has occurred during stream closing: {}", e);
}
try {
close(out);
} catch(IOException e) {
throw new MyException(e);
}
try (OutputStream out = // create output stream) {
// do the writing
} // at this point the stream is closed
这将以适当和安全的方式关闭您正在处理的流。干净的代码是一件好事,但在任何情况下破坏它都会给您带来更好的结果,如维护、调试。在这种情况下,我们应该这样做。它可以用更好的方式完成,比如自定义异常或使用上面建议的Java7功能,但根据我的经验,再写几行代码的成本是值得的。可能重复的
catch(IOException e){throw anException;}
是毫无意义的-您需要声明throws IOException
,才能做到这一点,因此,您不妨跳过try/catch这是一个很好的答案,但它会让我的代码变得不友好。我知道另一种解决方案,那就是尝试{…..out.close();}捕获(IOException e){抛出一个异常;}最后{IOUtils.CloseUnquired(out)}