关闭OutputStream
,ServerSocket
或其他实现AutoCloseable
接口的对象时遵循的最可靠的模式是什么?
我应该使用try
-catch
-finally
吗?或关闭钩子。
答案 0 :(得分:1)
使用AutoCloseable
实例的正确方法是使用try
-with-resources块,因此即使抛出异常,资源也可靠地closed。
赞:
try (OutputStream stream = new ...) {
... // use the resource
} catch (IOException e) {
... // exception handling code
}
您还可以control multiple resources使用一个块(而不是嵌套块):
try (
OutputStream out1 = ...;
OutputStream out2 = ...;
InputStream in1 = ...;
InputStream in2 = ...;
) {
...
}
Don't use a try
...finally
block:在某些极端情况(需要suppressed exception的情况)下,这是不正确的。
不要使用关闭钩子:资源很少真正是虚假的,而且这种方法很容易出现种族危险。使用try
-with-resources是正确关闭所有 AutoCloseable
资源的推荐方式:两者同时引入Java,以便它们可以一起工作。>
暗中地执行此操作有助于实施(推荐)规则,即只有负责创建或打开某物的代码才负责处置或关闭它:如果方法通过了OutputStream
,则它应该从不< / em> close()
。相反,它应该依赖于调用方将其关闭。如果您的方法都没有显式调用close()
,则可以保证您的代码绝不会引发异常(例如"Socket closed" java.net.SocketException
),因为它会尝试使用已关闭的资源。
这样做可以确保资源恰好关闭一次。请注意,通常,多次关闭AutoCloseable
是不安全的:{strong>不不能保证close()
操作是幂等的。