1
18
在Java 6和更低的大多数情况下,尝试/最终模式是正确处理流的方法。 一些人主张静默地关闭溪流。为此,请务必小心: Java: how not to make a mess of stream handling Java 7介绍 尝试使用资源 :
|
2
4
有一些问题,但是你在网上发现的代码确实很糟糕。 关闭缓冲流将关闭下面的流。你真的不想那样做。您只需要刷新输出流。另外,没有必要为文件指定底层流。性能很糟糕,因为您一次只复制一个字节(实际上,如果您使用java.io,则可以使用transferto/transfertfrom,后者速度更快)。当我们讨论它时,变量名很糟糕。所以:
如果你发现自己经常使用Try Finally,那么你可以用“围绕执行”的习语来考虑它。
在我看来:Java应该有某种方式在范围结束时关闭资源。我建议增加
|
3
3
是的,Java就是这样工作的。有控制反转-对象的用户必须知道如何清理对象,而不是在对象自身清理之后清理对象本身。不幸的是,大量的清理代码散布在Java代码中。 C有“using”关键字在对象超出范围时自动调用Dispose。Java没有这样的东西。 |
4
3
不幸的是,这种类型的代码在Java中有点臃肿。 顺便说一下,如果对osbuffer.read或odbuffer.write的某个调用引发了异常,那么您可能希望让该异常渗透到调用层次结构中。 在finally子句中调用close()会导致原始异常被close()-调用生成的异常替换。换句话说,失败的close()-方法可能隐藏由read()或write()生成的原始异常。所以,我认为如果 只有当 其他方法没有抛出。 我通常通过在内部尝试中包含一个明确的结束调用来解决这个问题: try { while (...) { read... write... } oSBuffer.close(); // exception NOT ignored here oDBuffer.close(); // exception NOT ignored here } finally { silentClose(oSBuffer); // exception ignored here silentClose(oDBuffer); // exception ignored here } static void silentClose(Closeable c) { try { c.close(); } catch (IOException ie) { // Ignored; caller must have this intention } } 最后,为了提高性能,代码应该可以使用缓冲区(每次读/写多个字节)。不能用数字来支持这一点,但是更少的调用应该比在上面添加缓冲流更有效。 |