Java中的可关闭接口
Closeable是需要关闭的数据的来源或目的地。当我们需要释放由对象(例如打开的文件)持有的资源时,会调用close()方法。它是流类的重要接口之一。 Closeable Interface 是在JDK 5中引入的,并在Java.io中定义。从JDK 7+开始,我们应该使用 AutoCloseable 接口。 closeable 接口是一个较旧的接口,它被引入以保持向后兼容性。
Closeable 界面的层次结构
Closeable接口扩展了AutoCloseable接口,因此任何实现 Closeable 的类也实现 AutoCloseable。
宣言
public interface Closeable extends AutoCloseable
{
public void close() throws IOException;
}
实现Closeable 接口
import java.io.Closeable;
import java.io.IOException;
public class MyCustomCloseableClass implements Closeable {
@Override
public void close() throws IOException {
// close resource
System.out.println("Closing");
}
}
Closeable 接口的 close() 方法
调用close() 方法以释放对象持有的资源。如果流已经关闭,则调用 close 方法没有任何效果。
句法
public void close() throws IOException
Note: Closeable is idempotent, which means calling the close() method more than once has no side effects.
可关闭接口的限制
Closeable 仅抛出 IOException并且在不破坏遗留代码的情况下无法更改它。因此,引入了AutoCloseable ,因为它可以抛出异常。
Closeable的超级接口:
- 自动关闭
Closeable 的子接口:
- 异步字节通道
- 异步通道
- 字节通道
- 渠道
- 图像输入流
- 图像输出流
- 多播频道
实现类:
- 抽象可选通道
- 抽象选择器
- 缓冲阅读器
- 缓冲写入器
- 缓冲输入流
- 缓冲输出流
- 检查输入流
- 检查输出流
可关闭与自动关闭
- Closeable 是在JDK 5中引入的,而 AutoCloseable 是在JDK 7+ 中引入的。
- Closeable扩展了 AutoCloseable ,Closeable 主要针对 IO 流。
- Closeable 扩展IOException而 AutoCloseable 扩展Exception。
- Closeable 接口是幂等的(多次调用 close() 方法没有任何副作用)而 AutoCloseable 不提供此功能。
- AutoCloseable 是专门为与try-with-resources语句一起使用而引入的。由于 Closeable 实现了 AutoCloseable,因此任何实现 Closeable 的类也实现了 AutoCloseable 接口,并且可以使用 try-with 资源来关闭文件。
try(FileInputStream fin = new FileInputStream(input)) {
// Some code here
}
在 Closeable 中使用 try-with Block
由于 Closeable 继承了 AutoCloseable 接口的属性,因此实现 Closeable 的类也可以使用 try-with-resources 块。可以在 try-with-resources 块中使用多个资源,并让它们全部自动关闭。在这种情况下,资源将按照它们在括号内创建的相反顺序关闭。
Java
// Java program to illustrate
// Automatic Resource Management
// in Java with multiple resource
import java.io.*;
class Resource {
public static void main(String s[])
{
// note the order of opening the resources
try (Demo d = new Demo(); Demo1 d1 = new Demo1()) {
int x = 10 / 0;
d.show();
d1.show1();
}
catch (ArithmeticException e) {
System.out.println(e);
}
}
}
// custom resource 1
class Demo implements Closeable {
void show() { System.out.println("inside show"); }
public void close()
{
System.out.println("close from demo");
}
}
// custom resource 2
class Demo1 implements Closeable {
void show1() { System.out.println("inside show1"); }
public void close()
{
System.out.println("close from demo1");
}
}
close from demo1
close from demo
java.lang.ArithmeticException: / by zero
Closeable接口的方法
Method | Description |
---|---|
close() | Closes this stream and releases any system resources associated with it. |