Java AutoCloseable接口
目录
1 基本概念
1.1 接口定义
1.2 使用场景
2 AutoCloseable实现类
2.1 java.io 包下的类
2.2 java.nio 包下的类(非阻塞I/O)
2.3 java.sql 包下的类(JDBC API)
2.4 java.util.zip 包下的类
2.5 java.security 包下的类
2.6 javax.crypto 包下的类
2.7 java.net 包下的类
2.8 其他类
3 自定义类实现 AutoCloseable
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 包下的类
FileInputStreamFileOutputStreamBufferedReaderBufferedWriterDataInputStreamDataOutputStreamPrintWriterScanner
2.2 java.nio 包下的类(非阻塞I/O)
FileChannelSocketChannelServerSocketChannelDatagramChannelSelector
2.3 java.sql 包下的类(JDBC API)
ConnectionStatementPreparedStatementResultSet
2.4 java.util.zip 包下的类
ZipFileGZIPOutputStreamGZIPInputStream
2.5 java.security 包下的类
KeyStore
2.6 javax.crypto 包下的类
CipherInputStreamCipherOutputStreamMacSecretKeyFactory
2.7 java.net 包下的类
SocketServerSocket
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");}// 执行一些操作}@Overridepublic 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博客
