1.查看API檔案,找到AutoCloseable相關定義
public interface AutoCloseable
該介面是從JDK1.7開始引入,并且該介面中只有一個方法close()
1 void close() throws Exception // 關閉此資源,放棄任何潛在資源
2.測驗AutoCloseable介面,實作自動關閉處理
2.1新建介面IMessage繼承AutoCloseable介面
1 interface IMessage extends AutoCloseable { 2 public void send(); //訊息發送 3 }
2.2新建NetMessage類實作IMessage介面(注意13行:close()方法拋出例外)
1 class NetMessage implements IMessage { //實作訊息的處理機制 2 private String msg; 3 4 public NetMessage(String msg) { 5 this.msg = msg; 6 } 7 8 public boolean open() { // 獲取資源連接 9 System.out.println("【OPEN】獲取資源發送連接資源"); 10 return true; 11 } 12 13 public void close() throws Exception { 14 System.out.println("【CLOSE】關閉訊息發送通道"); 15 } 16 17 @Override 18 public void send() { 19 if (this.open()) { 20 System.out.println("【**發送訊息**】" + this.msg); 21 } 22 } 23 }
2.3 測驗類
1 try (IMessage message = new NetMessage("Hello world")) { 2 message.send(); 3 } catch (Exception e) { 4 e.printStackTrace(); 5 }
2.4運行結果
【OPEN】獲取資源發送連接資源 【**發送訊息**】Hello world 【CLOSE】關閉訊息發送通道
3.以FileWriter為例,比較兩種不同的操作方式:
3.1.JDK1.7之前,在finally塊中手工關閉資源
1 public static void writeFile(String str) { 2 FileWriter fw = null; 3 try { 4 fw = new FileWriter("E://test.txt", true); 5 fw.write(str); 6 } catch (IOException e) { 7 e.printStackTrace(); 8 } finally { 9 if (fw != null) { 10 try { 11 fw.close(); 12 } catch (IOException e) { 13 e.printStackTrace(); 14 } 15 } 16 } 17 }
存在問題:
- 開發程序中可能會忘記關閉一些資源,導致記憶體泄漏;
- 關閉代碼的邏輯較冗長,可讀性比較差,
3.2.JDK1.7之后,使用AutoCloseable進行自動關閉
1 public static void newWriteFile(String str) { 2 try (FileWriter fw = new FileWriter("", true)) { 3 fw.write(str); 4 } catch (IOException e) { 5 e.printStackTrace(); 6 } 7 }
可以通過查看API檔案,在AutoCloseable中查看所有已知的實作類;這里以FileWriter為例:
- 點擊FIleWriter,查看內部實作:
public class FileWriter extends OutputStreamWriter
- 點擊OutputStreamWriter,繼承抽象類Writer:
public class OutputStreamWriter extends Writer
- 點擊Writer,其中實作了Closeable介面:
public abstract class Writer implements Appendable, Closeable, Flushable
- 點擊Closeable介面,查看內部實作,發現該介面繼承AutoCloseable介面(該介面只有close()方法):
public interface Closeable extends AutoCloseable
總結:
- AutoCloseable從1.7版本開始引入;
- AutoCloseable只有一個方法close(),并且拋出例外;
- 實作AutoCloseable自動關閉資源:
1.介面繼承AutoCloseable介面(或者類實作AutoCloseable介面);
2.結合例外處理陳述句:try()...catch()實作自動關閉處理,
其他結論:
1.JDK1.7之前,通常使用 try...catch()捕獲例外,在finally部分關閉IO流等,但JDK1.7之后,Java7的編譯器和運行環境支持新的try-with-resources陳述句(ARM塊,自動資源管理),寫在()里面的物件對應的類實作了自動關閉介面AutoCloseable,
2.對于實作AutoCloseable介面的類的實體,將其放到try后面(帶資源的try陳述句),在try(){}結束的時候會自動將這些資源關閉(呼叫close()方法),
3.帶資源的try陳述句的3個關鍵點:
- 由帶資源的try陳述句管理的資源必須是實作了AutoCloseable介面的類的物件;
- 在try陳述句中宣告的資源被隱式宣告為final;
- 通過分號分隔每個宣告可以管理多個資源,
文中部分內容和結論依據其它資料進行整理修改,若存在不妥之處,還請留言指正,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/88060.html
標籤:Java
下一篇:Lambda運算式和函式式介面
