IO 異常的處理 (try-catch-finally)
程式碼示例
FileWriter fw = null; // 提高 fw 作用域,使 finally 能夠使用 fw. try { fw = new FileWriter("d:\\testfolder\\a.txt"); fw.write('a'); } catch (IOException e) { e.printStackTrace(); } finally { // 如果傳遞的路徑不存在,會丟擲空指標異常,所以需要先行判斷 fw 是否為 null if (fw != null) { try { fw.close(); } catch (IOException) { e.printStackTrace(); } } }
JDK7 開始的新特性
- try 後面可以加個括號,括號中定義流物件。這樣不用寫 finally, 流物件使用完後自動釋放。
try (FileWriter fw = new FileWriter("d:\\testfolder\\a.txt")) { fw.write('a'); } catch (IOException e) { e.printStackTrace(); }
- try 後面可以加個括號,括號中定義流物件。這樣不用寫 finally, 流物件使用完後自動釋放。
JDK9 的新特性
try 前面定義流物件,try 後面的 () 中可以直接引入流物件名稱
由於在 try 前面新建了流物件,我們也需要對流物件中傳遞的路徑進行異常處理: throws FileNotFoundException
FileWriter fw = new FileWriter("d:\\testfolder\\a.txt"); FileReader fr = new FileWriter("d:\\testfolder\\b.txt"); try (fw; fr) { fw.write('a'); } catch (IOException e) { e.printStackTrace(); }
屬性集 Propertites
- 持久屬性集,可以儲存在流中或在流中載入,是繼承了 HashTable 的集合
- 唯一和IO流相結合的集合
- 雙列集合,因為繼承了 HashTable。key, value 都是字串型別的
- 特有操作字串的方法:
儲存獲取方法:Object setProperty(String key, String value)
呼叫 HashTable 方法 putString getProperty(String key)
用指定鍵在屬性列表中搜尋屬性,相當於 Map.get()Set<String> stringPropertyNames()
返回此屬性列表中的鍵集,相當於 keySet()方法
public void store(OutputStream out,String comments)
或public void store(Writer w,String comments)
將集合中的臨時資料,持久化寫入到硬碟中儲存public void load(InputStream in)
或public void load(Reader r)
將檔案中儲存的鍵值對,取出到集合中使用
緩衝流
- 給流物件建立一個緩衝陣列,透過緩衝區讀寫,減少系統IO次數,從而提高流物件讀取效率。
位元組緩衝輸出輸入流
public BufferedOutputStream(OutputStream out)
,public BufferedInputStream(InputStream in)
使用步驟
- 建立流物件,構造方法中傳遞檔案路徑
- 建立相應的緩衝流物件,構造方法中傳遞流物件
- 使用緩衝流物件中的 write() 方法,把資料寫入到內部緩衝區
- 使用緩衝流物件中的 flush() 方法,吧緩衝區資料重新整理到檔案中
- 釋放資源(如果選擇釋放資源,flush() 方法可以省略)
注意:
- 緩衝流構造方法中可以寫第二個引數,指定緩衝流內部緩衝區大小。
- 緩衝流寫入時如果不釋放或者重新整理,緩衝區資料無法寫入指定檔案。
- 緩衝流 write(), read() 方法和之前IO流中使用方法一樣。如 read() 可以讀取位元組陣列等等……
本作品採用《CC 協議》,轉載必須註明作者和本文連結