有3个接口对于流类至关重要。其中两个接口是Closeable和Flushable,它们是在java.io包中定义的,而且是由JDK5添加的。第3个接口是AutoColseable,它是由JDK7添加的新接口,被打包到java.lang包中。java
AutoCloseable接口对JDK7新添加的带资源的try语句提供了支持,这种try语句能够自动执行资源关闭过程。只有实现了AutoCloseable接口的类的对象才能够由带资源的try语句进行管理。AutoCloseable接口只定义了close()方法:缓存
void close() throws Exception
这个方法关闭调用对象,释放可能占用的全部资源。在带资源的try语句的末尾,会自动调用该方法,所以消除了显式调用close()方法的须要。spa
Closeable接口也定义了close()方法。实现了Closeable接口的类的对象能够被关闭。从JDK7开始,Closeable扩展了AutoCloseable。所以,在JDK7中,全部实现了Closeable接口的类也都实现了AutoCloseable接口。code
实现了Flushable接口的类的对象,能够强制将缓存的输出写入到与对象关联的流中。该接口定义了flush()方法,以下所示:对象
void flush() throws IOException
刷新流一般会致使缓存的输出被物理地写入到底层设备中。写入流的全部I/O类都实现了Flushable接口。接口
注:关于带资源的try语句的3个关键点:资源
由带资源的try语句管理的资源必须是实现了AutoCloseable接口的类的对象。作用域
在try代码中声明的资源被隐式声明为fianl。io
经过使用分号分隔每一个声明能够管理多个资源。class
此外请记住,所声明资源的做用域被限制在带资源的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(); } } }