每当我们实例化并使用某些对象/资源时,都应显式关闭它们,否则有可能发生资源泄漏。
从JSE7开始,引入了try-with-resources语句。在这种情况下,我们在try块中声明一个或多个资源,这些资源在使用后将自动关闭。(在try块的末尾)
我们在try块中声明的资源应扩展java.lang.AutoCloseable类。
以下程序演示了Java中的try-with-resources。
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class FileCopying { public static void main(String[] args) { try(FileInputStream inS = new FileInputStream(new File("E:\\Test\\sample.txt")); FileOutputStream outS = new FileOutputStream(new File("E:\\Test\\duplicate.txt"))){ byte[] buffer = new byte[1024]; int length; while ((length = inS.read(buffer)) > 0) { outS.write(buffer, 0, length); } System.out.println("File copied successfully!!"); } catch(IOException ioe) { ioe.printStackTrace(); } } }
输出结果
File copied successfully!!
问题内容: 我读到try-with-resources 中的块是可选的。我试图在try-with- resources块中创建一个对象,没有后续块,只是从eclipse中获取编译器错误:“ 自动调用引发了未处理的异常类型。” 由于可以在try-with- resources中使用的每个资源都实现了,因此在调用该方法时可能会引发异常,因此我不明白该子句是可选的,因为它不允许我跳过从中捕获异常的过程。
问题内容: 事实证明,几乎没有人正确地关闭Java中的资源。程序员要么不使用在所有的块,或者只是把在,这也是不正确的(因为从可影子从try块)。有时他们用类似的字眼仅是正确的,而不是正确的。解决了所有这些问题,但是仍然有大量用Java 6编写的项目。 在Java 6中进行仿真的最佳方法是什么?现在我用Guava Closer ,它总比没有好,但比它更丑。另外,有一种称为贷款模式的模式,但是Java
问题内容: Java7的try-with-resources非常好,但是我无法绕开为什么需要在语句中包括资源声明的问题。我的直觉说以下应该是可能的: las,这会导致语法错误(含糊地期待a )。将类型定义/声明移动到语句中是可行的,这当然会将事物移动到相应的范围内。当我想从封闭中获得更多收益时,我可以弄清楚该如何解决,我对 为什么 编译器需要这样的东西很感兴趣。 问题答案: 您的版本未明确定义应关
问题内容: 我试图通过使用常规try-catch-finally语句重新创建新的try-with- resources语句 来了解其工作方式。给定以下使用Java 7 try-with-resources的测试类: 您将如何重写此类以使用try-catch-finally语句,该语句所产生的字节码与try-with- resources语句所产生的字节码完全相同?同样,当使用两个资源时,同样的问题
我读到try-with资源中的块是可选的。我尝试在try-with资源块中创建一个对象,没有后续的块,只是从eclipse中获取编译器错误:“由自动调用引发的未处理异常类型。” 由于每一个资源,可以使用在try与资源实现,因此潜在地抛出一个异常调用方法,我不明白如何子句是可选的,因为它不允许我跳过从捕获异常。 是否有一些特殊要求,即AutoCloseable的具体实现不直接声明其方法中抛出的任何异
我想知道在try-with-resources块中放入return语句是否会阻止资源被自动关闭。 try-with-resources语句确保每个资源在语句结束时关闭。 如果由于return语句而始终无法到达语句的结尾,会发生什么情况?