探究java IO之AutoCloseable,Closeable和Flushable接口
有3个接口对于流类相当重要。
其中两个接口是Closeable和Flushable,它们是在java.io包中定义的,并且是由JDK5添加的。
第3个接口是AutoColseable,它是由JDK7添加的新接口,被打包到java.lang包中。
AutoCloseable接口对JDK7新添加的带资源的try语句提供了支持,这种try语句可以自动执行资源关闭过程。只有实现了AutoCloseable接口的类的对象才可以由带资源的try语句进行管理。AutoCloseable接口只定义了close()方法:
void close() throws Exception;
这个方法关闭调用对象,释放可能占用的所有资源。在带资源的try语句的末尾,会自动调用该方法,因此消除了显式调用close()方法的需要。
Closeable接口也定义了close()方法。实现了Closeable接口的类的对象可以被关闭。从JDK7开始,Closeable扩展了AutoCloseable。因此,在JDK7中,所有实现了Closeable接口的类也都实现了AutoCloseable接口。
再看Flushable
package java.io;
import java.io.IOException;
/**
* A <tt>Flushable</tt> is a destination of data that can be flushed. The
* flush method is invoked to write any buffered output to the underlying
* stream.
*
* @since 1.5
*/
public interface Flushable {
/**
* Flushes this stream by writing any buffered output to the underlying
* stream.
*
* @throws IOException If an I/O error occurs
*/
void flush() throws IOException;
}
刷新流通常会导致缓存的输出被物理地写入到底层设备中。写入流的所有I/O类都实现了Flushable接口。
注:关于带资源的try语句的3个关键点:
-
由带资源的try语句管理的资源必须是实现了AutoCloseable接口的类的对象。
-
在try代码中声明的资源被隐式声明为fianl。
-
通过使用分号分隔每个声明可以管理多个资源。
带资源的try语句(try-with-resource)的最简形式为:
try(Resource res = xxx)//可指定多个资源
{
work with res
}
try块退出时,会自动调用res.close()方法,关闭资源。
此外请记住,所声明资源的作用域被限制在带资源的try语句中。带资源的try语句的主要优点是:当try代码块结束时,资源(在此时流)会被自动关闭。因此,不太可能会忘记关闭流。使有带资源的try语句,通常可以使源代码更短,更清晰,更容易维护。如例:
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();
}
}
再如
@Test
public void jedisPool(){
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(30);//最大连接数
config.setMaxIdle(10);//最大空闲连接数
try (JedisPool jedisPool = new JedisPool(config, "xxx", 6379); Jedis jedis = jedisPool.getResource()) {
jedis.auth("root");
jedis.set("jedis", "谢飞");
String name = jedis.get("jedis");
System.out.println(name);
} catch (Exception e) {
e.printStackTrace();
}
}
(完)