文件处理的资源泄漏,try with resources VS try-catch-finally with file.close()

Resource leak for file processing, try with resources VS try-catch-finally with file.close()

当谈到文件处理和资源泄漏时,

这两种处理问题的方式各有什么优缺点:

尝试使用资源 VS Try/catch/finally 使用 file.close?

谢谢

最大的区别是使用 try-finally 方法进行异常屏蔽的危险。如果您不注意在关闭时捕获 finally 块中抛出的任何异常,您可以屏蔽 try 块中抛出的任何异常。这意味着如果 try 块中的代码抛出异常,则 finally 块中的代码抛出异常,传播的异常是来自 finally 块的异常(通常不是您希望看到的异常)。

try-with-resources 通过确保如果从 try 块中抛出异常,close 方法抛出的任何异常都会作为被抑制的异常来消除异常屏蔽的危险。

try-with-resources 在 try 块中没有抛出异常但在关闭时抛出异常的情况与使用 try-finally 并捕获 finally 块中抛出的任何东西的处理方式不同.使用 try-with-resources,将抛出关闭时抛出的异常(因为没有将其添加为抑制异常的异常),其中 try-finally 的通常方法是吃掉或记录从 finally 方法抛出的任何异常.因此,如果您不希望关闭时的失败导致抛出异常,破坏一些原本可以正常工作的逻辑,您可能希望为此避免使用 try-with-resources。

一个重要的区别是 try-with-resources 如何允许多个资源。编写 try-finally 块的人通常对嵌套 try 块不耐烦,并使用快捷方式导致错误,例如在 finally 块中放置过多的 close 语句(因此,如果一个失败,其余的将不执行,从而导致资源泄漏)。 try-with-resources 保证在退出时以正确的顺序关闭资源,这样就不需要嵌套块了。

我的理解是

try(InputStream is = new InputStream(...)){
    ...
}

在功能上等同于:

InputStream is=null;
try{
    is = new InputStream(...);
    ...
}finally{
    try{
        is.close();
    }catch(Exception e){}
}