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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。