目录
AutoCloseable
接口是 Java 中用于定义那些必须在使用后关闭的资源的对象。这个接口是在 Java 7 中引入的,目的是为了支持 try-with-resources
语句,这是一种自动管理资源(如文件或网络连接)的方式,确保这些资源在使用完毕后能够被正确地关闭,从而避免资源泄露。
1 基本概念
1.1 接口定义
AutoCloseable
接口非常简单,它只有一个方法:
public interface AutoCloseable {
void close() throws Exception;
}
close()
方法:当一个实现AutoCloseable
的对象不再需要时,调用此方法来释放其占用的资源。该方法可以抛出异常,通常用来表示无法正常关闭资源的情况。
1.2 使用场景
任何需要在使用后显式关闭以释放系统资源的对象都应该实现 AutoCloseable
接口。常见的例子包括文件、数据库连接、网络连接等。
try-with-resources语句参考:
2 AutoCloseable实现类
在Java中,许多类都实现了 AutoCloseable
接口,这些类通常涉及对系统资源的管理,比如文件、数据库连接、网络连接等。下面是一些常见的实现 AutoCloseable
接口的类:
2.1 java.io 包下的类
FileInputStream
FileOutputStream
BufferedReader
BufferedWriter
DataInputStream
DataOutputStream
PrintWriter
Scanner
2.2 java.nio 包下的类(非阻塞I/O)
FileChannel
SocketChannel
ServerSocketChannel
DatagramChannel
Selector
2.3 java.sql 包下的类(JDBC API)
Connection
Statement
PreparedStatement
ResultSet
2.4 java.util.zip 包下的类
ZipFile
GZIPOutputStream
GZIPInputStream
2.5 java.security 包下的类
KeyStore
2.6 javax.crypto 包下的类
CipherInputStream
CipherOutputStream
Mac
SecretKeyFactory
2.7 java.net 包下的类
Socket
ServerSocket
2.8 其他类
java.util.Scanner
用于读取输入java.util.zip.ZipFile
用于处理ZIP文件java.util.concurrent.locks.ReentrantLock
的newCondition()
方法返回的Condition
对象
3 自定义类实现 AutoCloseable
如果你需要创建一个自定义的资源管理类,你可以让它实现 AutoCloseable
接口,并提供 close()
方法来释放资源。例如:
import java.io.Closeable;
import java.io.IOException;
public class MyResource implements AutoCloseable {
private boolean open = true;
public void doSomething() throws IOException {
if (!open) {
throw new IOException("Resource is not open");
}
// 执行一些操作
}
@Override
public void close() throws IOException {
if (open) {
// 关闭资源
open = false;
}
}
}
然后你可以在 try-with-resources
语句中使用这个自定义类:
public class CustomResourceExample {
public static void main(String[] args) {
try (MyResource resource = new MyResource()) {
resource.doSomething();
} catch (IOException e) {
System.out.println("Error: " + e.getMessage());
}
}
}
这样就可以确保你的自定义资源也会被正确地关闭。
try-with-resources参考:
Java try-with-resources语句-CSDN博客