當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。