java.io.Closeable接口

說到java.io.Closeable接口就避不開java.lang.AutoCloseable接口,因為在java版本7.0時引入了java.lang.AutoCloseable接口躲庄,同時java.io.Closeable接口便繼承自java.lang.AutoCloseable接口了灰蛙。

java.io.Closeable

先說一下Closeable接口侥蒙,這個接口從java 5.0版本開始引入峰弹,其中中僅聲明了一個方法close赘理,用于關(guān)閉一個資源座韵。一直一來我都很困惑介陶,就算不實現(xiàn)這個接口堤舒,我給我的類實現(xiàn)一個close方法(或者別的方法)來完成“關(guān)閉”的功能不也是一樣的么。直到我看到下面的兩段代碼哺呜。

//第一段代碼
static void copy(String src, String dest)throws IOException {
  InputStream in = null;
  OutputStream out = null; 
  try {
    in = new FileInputStream(src);
    out = new FileOutputStream(dest);
    byte[] buf = new byte[1024];
    int n;
    while ((n = in.read(buf)) >= 0) {
      out.write(buf, 0, n);
    }
  } finally {
    if (in != null) in.close();
    if (out != null) out.close();
  }
}

上面這段代碼的問題在于舌缤,finally語句中的close方法也可能會拋出IOException異常。如果這正好發(fā)現(xiàn)在in.close被調(diào)用之時,那么這個異常就會阻止out.close被調(diào)用友驮,從而使輸出流保持在打開狀態(tài)漂羊。所以這個程序使得finally可能被意外結(jié)束。解決方式是將每一個close都包裝在一個try語句塊中卸留。從java 5.0版本開始走越,可以利用Closeable接口。

//第二段代碼
// 對第一段代碼中的finally語句改造如下
finally {
  closeIgnoringIOException(in);
  closeIgnoringIOException(out);
}
private static void closeIgnoringIOException(Closeable c) {
  if (c != null) {
    try {
      c.close();
    } catch (IOException ex) { }
  }
}

基于以上兩段代碼我知道了java.io.Closeable接口的用處耻瑟。

java.lang.AutoCloseable

在java 7.0j時引入了java.lang.AutoCloseable旨指,并且java.io.Closeable接口繼承自 java.lang.AutoCloseable。很多資源類都直接或間接的實現(xiàn)了此接口喳整。其實這個接口與try-with-resources語法是密切相關(guān)的谆构。

從AutoCloseable的注釋可知它的出現(xiàn)是為了更好的管理資源,準確說是資源的釋放框都,當一個資源類實現(xiàn)了該接口close方法搬素,在使用try-with-resources語法創(chuàng)建的資源拋出異常后,JVM會自動調(diào)用close 方法進行資源釋放魏保,當沒有拋出異常正常退出try-block時候也會調(diào)用close方法熬尺。

//第三段代碼
static void copy(String src, String dest)throws IOException {
  try (InputStream in=new FileInputStream(src);OutputStream out=new FileOutputStream(dest)){
    byte[] buf = new byte[1024];
    int n;
    while ((n = in.read(buf)) >= 0) {
      out.write(buf, 0, n);
    }
  }catch(Exception e) {
    System.out.println("catch block:"+e.getLocalizedMessage());
  }finally{
    System.out.println("finally block");
  }
}

因為InputStream和OutputStream都實現(xiàn)了java.io.Closeable接口(間接實現(xiàn)了java.lang.AutoCloseable接口)所以上面的【第三段代碼】與【第二段代碼的】一樣“安全”。

try-with-resources

try-with-resources 是在java 7.0 版本時引入的新語法特性谓罗。使用它配合java.lang.AutoCloseable接口可以更好的對資源進行釋放粱哼,減少繁瑣的異常處理。

  1. 使用try-with-resources結(jié)構(gòu)無論是否拋出異常在try-block執(zhí)行完畢后都會調(diào)用資源的close方法檩咱;
  2. 使用try-with-resources結(jié)構(gòu)創(chuàng)建多個資源揭措,try-block執(zhí)行完畢后調(diào)用的close方法的順序與創(chuàng)建資源順序相反;
  3. 使用try-with-resources結(jié)構(gòu)刻蚯,try-block塊拋出異常后先執(zhí)行所有資源(try的()中聲明的)的close方法然后在執(zhí)行catch里面的代碼然后才是finally绊含;
  4. 只用在try的()中聲明的資源的close方法才會被調(diào)用,并且當對象銷毀的時候close不會被再次調(diào)用炊汹;
  5. 使用try-with-resources結(jié)構(gòu)無須顯式調(diào)用資源釋放艺挪,編程效率高,代碼更簡潔兵扬。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市口蝠,隨后出現(xiàn)的幾起案子器钟,更是在濱河造成了極大的恐慌,老刑警劉巖妙蔗,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件傲霸,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機昙啄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門穆役,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人梳凛,你說我怎么就攤上這事耿币。” “怎么了韧拒?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵淹接,是天一觀的道長。 經(jīng)常有香客問我叛溢,道長塑悼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任楷掉,我火速辦了婚禮厢蒜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘烹植。我一直安慰自己斑鸦,他們只是感情好,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布刊橘。 她就那樣靜靜地躺著鄙才,像睡著了一般。 火紅的嫁衣襯著肌膚如雪促绵。 梳的紋絲不亂的頭發(fā)上攒庵,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機與錄音败晴,去河邊找鬼浓冒。 笑死,一個胖子當著我的面吹牛尖坤,可吹牛的內(nèi)容都是我干的稳懒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼慢味,長吁一口氣:“原來是場噩夢啊……” “哼场梆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起纯路,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤或油,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后驰唬,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體顶岸,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡腔彰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了辖佣。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片霹抛。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖卷谈,靈堂內(nèi)的尸體忽然破棺而出杯拐,到底是詐尸還是另有隱情,我是刑警寧澤雏搂,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布藕施,位于F島的核電站,受9級特大地震影響凸郑,放射性物質(zhì)發(fā)生泄漏裳食。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一芙沥、第九天 我趴在偏房一處隱蔽的房頂上張望诲祸。 院中可真熱鬧,春花似錦而昨、人聲如沸救氯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽着憨。三九已至,卻和暖如春务嫡,著一層夾襖步出監(jiān)牢的瞬間甲抖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工心铃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留准谚,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓去扣,卻偏偏與公主長得像柱衔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子愉棱,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理唆铐,服務發(fā)現(xiàn),斷路器奔滑,智...
    卡卡羅2017閱讀 134,672評論 18 139
  • 1. Java基礎部分 基礎部分的順序:基本語法或链,類相關(guān)的語法,內(nèi)部類的語法档押,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,645評論 18 399
  • /Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home...
    光劍書架上的書閱讀 3,884評論 2 8
  • 自然給了鄉(xiāng)村以落后令宿, 也給了她涼風叼耙。 自然給了城市以熱鬧, 也給了她空調(diào)粒没。
    愛花的小巫閱讀 341評論 0 0
  • 八點半了勉強爬起來準備站樁筛婉,心想可別打擾我啊癞松!剛站好打開音樂爽撒,就來了一通賣房的騷擾電話。繼續(xù)聽著引導語做準備工作响蓉,...
    閔靜閱讀 234評論 0 1