探究java IO之AutoCloseable,Closeable和Flushable接口

文章转自:

http://my.oschina.net/fhd/blog/344961

有3个接口对于流类相当重要。其中两个接口是CloseableFlushable,它们是在java.io包中定义的,并且是由JDK5添加的。第3个接口是AutoColseable,它是由JDK7添加的新接口,被打包到java.lang包中。

AutoCloseable接口JDK7新添加的带资源的try语句提供了支持,这种try语句可以自动执行资源关闭过程。只有实现了AutoCloseable接口的类的对象才可以由带资源的try语句进行管理。AutoCloseable接口只定义了close()方法:

?
1
void  close()  throws  Exception

这个方法关闭调用对象,释放可能占用的所有资源。在带资源的try语句的末尾,会自动调用该方法,因此消除了显式调用close()方法的需要。

Closeable接口也定义了close()方法。实现了Closeable接口的类的对象可以被关闭。从JDK7开始,Closeable扩展了AutoCloseable。因此,在JDK7中,所有实现了Closeable接口的类也都实现了AutoCloseable接口

实现了Flushable接口的类的对象,可以强制将缓存的输出写入到与对象关联的流中。该接口定义了flush()方法,如下所示:

?
1
void  flush()  throws  IOException

刷新流通常会导致缓存的输出被物理地写入到底层设备中。写入流的所有I/O类都实现了Flushable接口

注:关于带资源的try语句的3个关键点

  • 由带资源的try语句管理的资源必须是实现了AutoCloseable接口的类的对象。

  • 在try代码中声明的资源被隐式声明为fianl

  • 通过使用分号分隔每个声明可以管理多个资源。

此外请记住,所声明资源的作用域被限制在带资源的try语句中。带资源的try语句的主要优点是:当try代码块结束时,资源(在此时流)会被自动关闭。因此,不太可能会忘记关闭流。使有带资源的try语句,通常可以使源代码更短,更清晰,更容易维护。如例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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();
         }
     }
}

你可能感兴趣的:(探究java IO之AutoCloseable,Closeable和Flushable接口)