Closeable用于需要关闭的数据的源或者目标。close()方法在当你需要释放被某些对象正在持有的资源(比如打开文件)的时候被调用。它是stream(文件流)类的一个重要的接口之一。Closeable接口是JDK5开始引入并在java.io.中实现的。从JDK7+开始,我们推荐使用AutoCloseable接口。Closeable接口是为了保持后续兼容性而引入的老接口。

由于Closeable接口继承自AutoCloseable接口,所以实现了Closeable接口的类也就实现了AutoCloseable。
Closeable和AutoCloseable的区别
- Closeable是JDK5引入,然而AutoCloseable是JDK7+引入
- Closeable继承自AutoCloseable并且,Closeable针对性用于IO流
- Closeable继承了IOException,而AutoCloseable继承了Exception
- Closeable接口是幂等的(多次调用close()方法没有任何副作用),而AutoCloseable不提供幂等性的支持
- AutoCloseable是为了和try-with-resource语句协作而引用的,自从Closeable实现AutoCloseable,因此任何实现了Closeable也间接实现了AutoCloseable接口,并且能够使用try-with-resource资源来关闭文件。
AutoCloseable、Closeable与try-with-resource
已经实现了Closeable或AutoCloseable的类,如果想让其生效(即调用close()方法),必须和try-with-resource语句一起使用。示例如下:
public class Test {
public Test(){
try(MyCloseableClass myCloseableObject = new MyCloseableClass()){
System.out.println("Test is Running...");
}catch (Exception e){
e.printStackTrace();
}
}
class MyCloseableClass implements AutoCloseable{
@Override
public void close() throws Exception {
System.out.println("close resource...");
}
}
public static void main(String[] args) {
Test test = new Test();
}
}