try-with-resource優(yōu)雅關(guān)閉io流的方法
前言
JAVA的一大特性就是JVM會(huì)對內(nèi)部資源實(shí)現(xiàn)自動(dòng)回收,即自動(dòng)GC,給開發(fā)者帶來了極大的便利。但是JVM對外部資源的引用卻無法自動(dòng)回收,例如數(shù)據(jù)庫連接,網(wǎng)絡(luò)連接以及輸入輸出IO流等,這些連接就需要我們手動(dòng)去關(guān)閉,不然會(huì)導(dǎo)致外部資源泄露,連接池溢出以及文件被異常占用等。
傳統(tǒng)的手動(dòng)釋放外部資源一般放在一般放在try{}catch(){}finally{}機(jī)制的finally代碼塊中,因?yàn)閒inally代碼塊中語句是肯定會(huì)被執(zhí)行的,即保證了外部資源最后一定會(huì)被釋放。同時(shí)考慮到finally代碼塊中也有可能出現(xiàn)異常,finally代碼塊中也有一個(gè)try{}catch(){},這種寫法是經(jīng)典的傳統(tǒng)釋放外部資源方法,顯然是非常繁瑣的。
傳統(tǒng)寫法操作io流
例如如下讀取的文件的io流,我們之前可能會(huì)這樣寫
public class Main { public static void main(String[] args) { FileInputStream fileInputStream =null; try { fileInputStream = new FileInputStream(new File("/Users/laoniu/a.txt")); //打開流 byte[] bytes = new byte[1024]; int line = 0; //讀取數(shù)據(jù) while ((line = fileInputStream.read(bytes))!= -1){ System.out.println(new String(bytes,0,line)); } } catch (IOException e) { e.printStackTrace(); }finally { if (fileInputStream != null){ //不為空 try { fileInputStream.close(); //關(guān)閉流 } catch (IOException e) { e.printStackTrace(); } } } } }
使用try-with-resource寫法優(yōu)雅操作io流
public class Main { public static void main(String[] args) { //把打開流的操作都放入try()塊里 try( FileInputStream fileInputStream = new FileInputStream(new File("/Users/laoniu/a.txt"))) { byte[] bytes = new byte[1024]; int line = 0; while ((line = fileInputStream.read(bytes))!= -1){ System.out.println(new String(bytes,0,line)); } } catch (IOException e) { e.printStackTrace(); } } }
在try()中可以編寫多個(gè)文件io流或網(wǎng)絡(luò)io流。讓我們看看java編譯器是怎么幫我們實(shí)現(xiàn)的
借助idea查看編譯后的代碼
可以看到編譯后的代碼,java編譯器自動(dòng)替我們加上了關(guān)閉流的操作。所以跟我們自己關(guān)閉流是一樣的。try-with-resource這樣優(yōu)雅的寫法還是不錯(cuò)的,讓代碼看起來不那么臃腫。
注意jdk1.7以后才可以用
總結(jié)
到此這篇關(guān)于try-with-resource優(yōu)雅關(guān)閉io流的文章就介紹到這了,更多相關(guān)try-with-resource優(yōu)雅關(guān)閉io流內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot整合Redis哨兵模式的實(shí)現(xiàn)示例
Redis哨兵模式是Redis高可用方案的一種實(shí)現(xiàn)方式,通過哨兵來自動(dòng)實(shí)現(xiàn)故障轉(zhuǎn)移,從而保證高可用,本文主要介紹了SpringBoot整合Redis哨兵模式的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02Java 1,2,3,4能組成多少個(gè)互不相同且無重復(fù)數(shù)字的實(shí)現(xiàn)代碼
這篇文章主要介紹了Java 1,2,3,4能組成多少個(gè)互不相同且無重復(fù)數(shù)字的實(shí)現(xiàn)代碼,需要的朋友可以參考下2017-02-02SpringBoot配置數(shù)據(jù)庫密碼加密的方法
由于系統(tǒng)安全的考慮,配置文件中不能出現(xiàn)明文密碼的問題,本文就給大家詳細(xì)介紹下springboot配置數(shù)據(jù)庫密碼加密的方法,下面話不多說了,來一起看看詳細(xì)的介紹吧,需要的朋友可以參考下2023-08-08SpringBoot3結(jié)合gRpc實(shí)現(xiàn)遠(yuǎn)程服務(wù)調(diào)用的流程步驟
gRPC是一個(gè)現(xiàn)代開源高性能遠(yuǎn)程過程調(diào)用(RPC)框架,可以在任何環(huán)境中運(yùn)行,它由Google開發(fā),旨在幫助開發(fā)人員更輕松地構(gòu)建分布式應(yīng)用,特別是當(dāng)代碼可能在不同地方運(yùn)行的時(shí)候,本文介紹了SpringBoot3結(jié)合gRpc實(shí)現(xiàn)遠(yuǎn)程服務(wù)調(diào)用的流程步驟,需要的朋友可以參考下2024-07-07