📜  Java中的可关闭接口

📅  最后修改于: 2022-05-13 01:55:31.741000             🧑  作者: Mango

Java中的可关闭接口

Closeable是需要关闭的数据的来源或目的地。当我们需要释放由对象(例如打开的文件)持有的资源时,会调用close()方法。它是流类的重要接口之一。 Closeable Interface 是在JDK 5中引入的,并在Java.io中定义。从JDK 7+开始,我们应该使用 AutoCloseable 接口。 closeable 接口是一个较旧的接口,它被引入以保持向后兼容性。

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

可关闭接口的限制

Closeable 仅抛出 IOException并且在不破坏遗留代码的情况下无法更改它。因此,引入了AutoCloseable ,因为它可以抛出异常。

Closeable的超级接口:

  • 自动关闭

Closeable 的子接口:

  • 异步字节通道
  • 异步通道
  • 字节通道
  • 渠道
  • 图像输入流
  • 图像输出流
  • 多播频道

实现类:

  • 抽象可选通道
  • 抽象选择器
  • 缓冲阅读器
  • 缓冲写入器
  • 缓冲输入流
  • 缓冲输出流
  • 检查输入流
  • 检查输出流

可关闭与自动关闭

  1. Closeable 是在JDK 5中引入的,而 AutoCloseable 是在JDK 7+ 中引入的。
  2. Closeable扩展了 AutoCloseable ,Closeable 主要针对 IO 流。
  3. Closeable 扩展IOException而 AutoCloseable 扩展Exception。
  4. Closeable 接口是幂等的(多次调用 close() 方法没有任何副作用)而 AutoCloseable 不提供此功能。
  5. 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.