当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Java Closeable用法及代码示例


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

Closeable接口的层次结构

Hierarchy of Closeable interface

可关闭的接口扩展AutoCloseable接口,因此任何实现 Closeable 的类也实现 AutoCloseable。

声明

public interface Closeable extends AutoCloseable 
{
    public void close() throws IOException;
}

实施 可关闭的接口

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");
    }
}

close() Closeable接口的方法

调用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,因为它可以抛出异常。

SuperInterface 可关闭:

  • AutoCloseable

SubInterfaces 可关闭:

  • AsynchronousByteChannel
  • AsynchronousChannel
  • ByteChannel
  • Channel
  • ImageInputStream
  • ImageOutputStream
  • MulticastChannel

实施类:

  • AbstractSelectableChannel
  • AbstractSelector
  • BufferedReader
  • BufferedWriter
  • BufferedInputStream
  • BufferedOutputStream
  • CheckedInputStream
  • CheckedOutputStream

可关闭与AutoCloseable

  1. Closeable 的引入是JDK 5而 AutoCloseable 是通过JDK 7+。
  2. 可关闭扩展AutoCloseable而Closeable主要是针对IO流的。
  3. 可关闭延伸IO异常而 AutoCloseable 扩展例外。
  4. 可关闭的接口是幂等的(多次调用close()方法不会产生任何副作用)而AutoCloseable不提供此函数。
  5. AutoCloseable是专门引入来与try-with-resources声明。由于 Closeable 实现了 AutoCloseable,因此任何实现 Closeable 的类也实现了 AutoCloseable 接口,并且可以使用 try-with 资源来关闭文件。
try(FileInputStream fin = new FileInputStream(input)) {
    // Some code here
}

try-with 块与 Closeable 的使用

由于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() 关闭该流并释放与其关联的所有系统资源。


相关用法


注:本文由纯净天空筛选整理自goelshubhangi3118大神的英文原创作品 Closeable Interface in Java。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。