AutoCloseable 是 Java 中的一个重要接口,它的引入是为了支持资源的自动管理,特别是在使用完资源后自动关闭资源,以避免资源泄漏。它是 Java7 中引入的特性,配合 try-with-resources 语句使用,可以让代码更加简洁和安全。
该接口中只有一个方法:
void close() throws Exception 用于关闭资源。当实现该接口的对象在 try-with-resources 语句中使用时,close() 方法会在 try 代码块执行完毕后自动调用,无论 try 块是正常结束还是因异常结束。
在 try-with-resources 语句中使用实现 AutoCloseable 接口的对象时,Java 会确保在 try 块结束后自动调用 close() 方法,无需显式调用 close(),减少了代码量和因忘记关闭资源导致的错误。
即使 try 块中抛出异常,close() 方法也会被调用,并且 close() 方法中抛出的异常会被抑制,不会覆盖 try 块中抛出的异常。
下面示例使用 try-with-resources 自动关闭 BufferedReader 资源,代码如下:
package com.hxstrive.java_lang; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; /** * AutoCloseable 示例 * @author hxstrive */ public class AutoCloseableExample { public static void main(String[] args) { // 使用 try-with-resources 语句 try (BufferedReader reader = new BufferedReader(new FileReader("D:\\example.txt"))) { String line; while ((line = reader.readLine())!= null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } } }
上面示例,创建了一个 BufferedReader 对象,它是一个实现了 AutoCloseable 接口的类。在 try-with-resources 语句中,将 BufferedReader 实例化并赋值给 reader,用于读取 D:\example.txt 文件。在 try 块中,使用 readLine() 方法逐行读取文件内容并输出。
当 try 块执行完毕,无论是否抛出异常,Java 会自动调用 reader 的 close() 方法,确保文件资源被正确关闭。这样避免了在 finally 块中手动调用 close() 方法,减少了代码的复杂性和出错的可能性。
以下是另一个自定义类实现 AutoCloseable 的示例:
package com.hxstrive.java_lang; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; /** * AutoCloseable 示例 * @author hxstrive */ public class AutoCloseableExample2 { public static void main(String[] args) { // 使用 try-with-resources 语句 try (MyAutoCloseable my = new MyAutoCloseable()) { System.out.println(my.cal(10, 0)); } catch (Exception e) { e.printStackTrace(); } //call close() //java.lang.ArithmeticException: / by zero // at com.hxstrive.java_lang.AutoCloseableExample2$MyAutoCloseable.cal(AutoCloseableExample2.java:20) // at com.hxstrive.java_lang.AutoCloseableExample2.main(AutoCloseableExample2.java:11) } static class MyAutoCloseable implements AutoCloseable { public int cal(int a, int b) { return a / b; } // 始终会被调用 @Override public void close() throws Exception { System.out.println("call close()"); } } }
上面示例中,定义了一个 MyAutoCloseable 类,它实现了 AutoCloseable 接口。在 MyAutoCloseable 类中,有一个 cal() 方法和一个 close() 方法。在 close() 方法中,我们打印了 "call close()",表示资源关闭操作。当 try 块结束时,会自动调用 MyAutoCloseable 的 close() 方法,输出“call close()”。
注意:通过使用 AutoCloseable 接口,我们可以更方便地管理各种需要关闭的资源,包括文件、网络连接、数据库连接等,提高代码的健壮性和可维护性,避免因忘记关闭资源而导致的资源泄漏和性能问题。在实际开发中,许多资源相关的类都已经实现了 AutoCloseable 接口,如 InputStream、OutputStream、Connection 等,使用 try-with-resources 可以极大地简化代码,提高开发效率和代码质量。