java try-with-resource語句使用

定義

JDK7之后,Java多了個新的語法:try-with-resources語句,
可以理解為是一個聲明一個或多個資源的 try語句(用分號隔開),
一個資源作為一個對象,并且這個資源必須要在執(zhí)行完關(guān)閉的,
try-with-resources語句確保在語句執(zhí)行完畢后,每個資源都被自動關(guān)閉 。
任何實現(xiàn)了** java.lang.AutoCloseable**的對象, 包括所有實現(xiàn)了 java.io.Closeable 的對象
, 都可以用作一個資源。

我們根據(jù)定義來自己實現(xiàn)一個玩玩:

public class MyAutoClosable implements AutoCloseable {
    public void doIt() {
        System.out.println("MyAutoClosable doing it!");
    }

    @Override
    public void close() throws Exception {
        System.out.println("MyAutoClosable closed!");
    }

    public static void main(String[] args) {
        try(MyAutoClosable myAutoClosable = new MyAutoClosable()){
            myAutoClosable.doIt();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
輸出.png

發(fā)現(xiàn)close方法被自動執(zhí)行了,這個的好處在于,我們又可以變懶了,不用再去關(guān)心連接調(diào)用完了是否關(guān)閉,文件讀寫完了是否關(guān)閉,專心的實現(xiàn)業(yè)務(wù)即可。

我們根據(jù)這個特性,來試下文件讀寫
先試試傳統(tǒng)寫法

public void readFile() throws FileNotFoundException {
        FileReader fr = null;
        BufferedReader br = null;
        try{
            fr = new FileReader("d:/input.txt");
            br = new BufferedReader(fr);
            String s = "";
            while((s = br.readLine()) != null){
                System.out.println(s);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                br.close();
                fr.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

需要在最后finally中關(guān)閉讀文件流。

我們再試試try with resource寫法

public void readFile() throws FileNotFoundException {

        try(
                FileReader fr = new FileReader("d:/input.txt");
                BufferedReader br = new BufferedReader(fr)
        ){
            String s = "";
            while((s = br.readLine()) != null){
                System.out.println(s);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

代碼也整潔了一些

通過查看源碼可以發(fā)現(xiàn)

  • public class FileReader extends InputStreamReader
  • public class InputStreamReader extends Reader
  • public abstract class Reader implements Readable, Closeable

  • public class BufferedReader extends Reader
  • public abstract class Reader implements Readable, Closeable

發(fā)現(xiàn)FileReader和BufferedReader最終都實現(xiàn)了Closeable接口,所以根據(jù)try with resource 定義,他們都是可以自動關(guān)閉的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,839評論 18 399
  • 小編費力收集:給你想要的面試集合 1.C++或Java中的異常處理機(jī)制的簡單原理和應(yīng)用。 當(dāng)JAVA程序違反了JA...
    八爺君閱讀 5,239評論 1 114
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,695評論 19 139
  • 在經(jīng)過一次沒有準(zhǔn)備的面試后,發(fā)現(xiàn)自己雖然寫了兩年的android代碼,基礎(chǔ)知識卻忘的差不多了。這是程序員的大忌,沒...
    猿來如癡閱讀 3,141評論 3 10
  • 我一直想嘗試這樣一種收費方式: 有全部功能、但交互復(fù)雜的版本,免費; 僅必要功能、但交互簡潔的版本,收費。 聽起來...
    ITJason閱讀 231評論 7 1

友情鏈接更多精彩內(nèi)容