转载自:https://my.oschina.net/fhd/blog/344961
Closeable
和Flushable
接口是在JDK5
中加入到java.io
包中的,AutoColseable
是在JDK7
时加入到java.lang
包中的。
一、AutoColseable接口
AutoCloseable
接口对JDK7
新添加的带资源的try语句
提供了支持,这种try
语句可以自动执行资源关闭过程。只有实现了AutoCloseable
接口的类的对象才可以由带资源的try
语句进行管理。AutoCloseable
接口只定义了close()
方法,如下:
void close() throws Exception
这个方法关闭调用对象,释放可能占用的所有资源。在带资源的try
语句的末尾,会自动调用该方法,消除了显式调用close()方法的需要。
二、Closeable接口
Closeable
接口也定义了close()
方法。实现了Closeable
接口的类的对象可以被关闭。从JDK7
开始,Closeable
扩展了AutoCloseable
。因此,在JDK7
中,所有实现了Closeable
接口的类也都实现了AutoCloseable
接口。
三、Flushable接口
实现了Flushable
接口的类的对象,可以强制将缓存的输出写入到与对象关联的流中。该接口定义了flush()
方法,如下所示:
void flush() throws IOException
刷新流通常会导致缓存的输出被物理地写入到底层设备中。写入流的所有I/O类都实现了Flushable接口
。
注意:关于带资源的try语句的3个关键点:
- 由带资源的
try
语句管理的资源必须是实现了AutoCloseable
接口的类的对象。 - 在
try
代码中声明的资源被隐式
声明为final
。 - 通过使用分号分隔每个声明可以管理多个资源。
此外,所声明资源的作用域被限制在带资源的try
语句中。带资源的try
语句的主要优点是:当try
代码块结束时,资源(在此时的流)会被自动关闭。因此,不太可能会忘记关闭流。使有带资源的try
语句,通常可以使源代码更短,更清晰,更容易维护
。
例如:
package io;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class InputStreamReaderTest {
public static void main(String[] args) {
try(BufferedReader reader = new BufferedReader(new InputStreamReader(
new FileInputStream(new File("/home/fuhd/text")),"UTF8"),1024)){
//这里直接读一行
System.out.println(reader.readLine());
}catch(IOException e){
e.printStackTrace();
}
}
}