java try-with-resource語(yǔ)句使用

定義

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

我們根據(jù)定義來(lái)自己實(shí)現(xiàn)一個(gè)玩玩:

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方法被自動(dòng)執(zhí)行了,這個(gè)的好處在于,我們又可以變懶了,不用再去關(guān)心連接調(diào)用完了是否關(guān)閉,文件讀寫(xiě)完了是否關(guān)閉,專心的實(shí)現(xiàn)業(yè)務(wù)即可。

我們根據(jù)這個(gè)特性,來(lái)試下文件讀寫(xiě)
先試試傳統(tǒng)寫(xiě)法

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)閉讀文件流。

我們?cè)僭囋噒ry with resource寫(xiě)法

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();
        }
    }

代碼也整潔了一些

通過(guò)查看源碼可以發(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最終都實(shí)現(xiàn)了Closeable接口,所以根據(jù)try with resource 定義,他們都是可以自動(dòng)關(guān)閉的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

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