java IO之AutoCloseable,Closeable和Flushable介面

來源:互聯網
上載者:User

標籤:

有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語句,通常可以使原始碼更短,更清晰,更容易維護。如例:

package demo;import java.io.BufferedReader;import java.io.FileInputStream;import java.io.InputStreamReader;/** * AutoCloseable介面,表示一種不再使用時需要關閉的資源。這個介面下只有一個方法,close()。這個方法在try-with- * resource文法下會被自動調用,支援拋出Exception,當然它也鼓勵拋出更詳細的異常。close()建議不要拋出線程中斷的 * InterruptedException。對這個介面的實現,規範強烈建議close()是等冪的,也就是說多次調用close()方法和一次調用的結 * 果是一樣的。 * JDK1.7 新特性 *  */public class InputStreamReaderTest {    public static void main(String[] args) {        try (BufferedReader reader = new BufferedReader(new InputStreamReader(                new FileInputStream("src\\fuhd.txt"), "UTF8"), 1024)) {            System.out.println(reader.readLine());        } catch (Exception e) {            e.printStackTrace();        }        //樣本,聲明自己的兩個資源類,實現AutoCloseable介面。        try (MyResource myResource = new MyResource();                MyResource2 myResource2 = new MyResource2()) {            myResource.readResource();            myResource2.readResource();        } catch (Exception e) {            e.printStackTrace();        }    }}class MyResource implements AutoCloseable {    @Override    public void close() throws Exception {        System.out.println("close resource");    }    public void readResource() {        System.out.println("read resource");    }}class MyResource2 implements AutoCloseable {    @Override    public void close() throws Exception {        System.out.println("close resource2");    }    public void readResource() {        System.out.println("read resource2");    }}

 輸出

熱度...........................。read resourceread resource2close resource2close resource

 

java IO之AutoCloseable,Closeable和Flushable介面

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.