A可關閉是需要關閉的數據的源或目的地。這close()當我們需要釋放對象(例如打開的文件)所占用的資源時,會調用該方法。它是流類的重要接口之一。可關閉接口被引入JDK 5並定義在java.io。從JDK 7+,我們應該使用AutoCloseable接口。可關閉的接口是一個較舊的接口,引入是為了保持向後兼容性。
Closeable接口的層次結構
可關閉的接口擴展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
- Closeable 的引入是JDK 5而 AutoCloseable 是通過JDK 7+。
- 可關閉擴展AutoCloseable而Closeable主要是針對IO流的。
- 可關閉延伸IO異常而 AutoCloseable 擴展例外。
- 可關閉的接口是冪等的(多次調用close()方法不會產生任何副作用)而AutoCloseable不提供此函數。
- 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() | 關閉該流並釋放與其關聯的所有係統資源。 |
相關用法
- Java ClosedChannelException用法及代碼示例
- Java Closures用法及代碼示例
- Java Clock equals()用法及代碼示例
- Java Clock fixed()用法及代碼示例
- Java Clock getZone()用法及代碼示例
- Java Clock hashCode()用法及代碼示例
- Java Clock instant()用法及代碼示例
- Java Clock millis()用法及代碼示例
- Java Clock offset()用法及代碼示例
- Java Clock system()用法及代碼示例
- Java Clock systemDefaultZone()用法及代碼示例
- Java Clock systemUTC()用法及代碼示例
- Java Clock tick()用法及代碼示例
- Java Clock tickSeconds()用法及代碼示例
- Java Clock tickMinutes()用法及代碼示例
- Java Clock withZone()用法及代碼示例
- Java CloneNotSupportedException用法及代碼示例
- Java Cloneable用法及代碼示例
- Java ClassLoader.clearAssertionStatus()用法及代碼示例
- Java ClassLoader.getSystemResource()用法及代碼示例
- Java Class asSubclass()用法及代碼示例
- Java Class getSuperClass()用法及代碼示例
- Java Class isAnonymousClass()用法及代碼示例
- Java Class isPrimitive()用法及代碼示例
- Java Class newInstance()用法及代碼示例
注:本文由純淨天空篩選整理自goelshubhangi3118大神的英文原創作品 Closeable Interface in Java。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。