第十九天

字符輸出流,緩衝流和序列化

字符輸出流

字符流的應用限制比較多,沒有字節流的應用廣。
主要有以下幾點:

  1. 字符流不使用close方法的話,文件則不會輸出任何內容。
  2. 字符流主要是用於處理中文,很方便快捷,但是其他的就不行了,例如音頻、圖片、視頻等。
    但是,字符流拷貝文本文件時非常的快!
緩衝流

緩衝流主要是爲了提高整體的讀取、寫入效率,降低了CPU通過內存訪問硬盤的次數。提高效率,降低磁盤損耗。
字節輸入緩衝
BufferedInputStream
字節輸出緩衝
BufferedOutputStream
字符輸入緩衝
BufferedReader
字符輸出緩衝
BufferedWrite
【重點】

  1. 所有的緩衝流都沒有任何的讀取,寫入文件能力,這裏都需要對應的輸入流和輸出流來提供對應的能力。
  2. 在創建緩衝流流對象時,需要傳入對應的輸入流對象和輸出流對象。
  3. 底層就是提供了一個默認大小的緩衝數組,用於提高效率

其中,字節緩衝流的底層中有一個默認容量爲8KB的byte類型緩衝數組。字符緩衝流的底層中有一個默認容量爲16KB的byte類型緩衝數組。

而(字符、字節)輸入緩衝流中fill方法是一個操作核心

  1. 從硬盤中讀取數據,讀取的數據容量和緩衝數組容量一致。
  2. 所有的read方法,都是從緩衝數組中讀取數據
  3. 每一次讀取數據之前,都會檢查緩衝區內是否有數據,如果沒有,fill方法執行,填充數據。
    利用緩衝,fill方法,可以極大的降低CPU通過內存訪問硬盤的次數。同時程序操作的數據是在內存中進行交互的。

大概代碼:

public static void saveData(StudentManager studentManager) {
  BufferedWriter bw = null;
  
  try {
   // 選擇寫入文件的方式是刪除寫!!!
   bw = new BufferedWriter(new FileWriter(new File("./data/students.txt")));
} catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } finally {
   if (bw != null) {
    try {
     bw.close();
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   }
  }
序列化

用途:
  Java中提供了一種序列化操作的方式,用一個字節序列化來表示一個對象,該字節序列化中保存了【對象的屬性】,【對象的類型】和【對象的數據】。把字節序列化保存到文件中,就可以做到持久化保存數據內容。

ObjectOutputStream類
將對象數據序列化,保存到文件中

ObjectInputStream類
從文件中讀取被序列化之後的字節數據,提供反序列化操作,得到一個對象。

【序列化注意事項】

  1. 如果一個類需要進行序列化操作,必須遵從。java.io.Serializable。不遵從無法進行序列化操作
  2. 序列化之後從文件中讀取序列化內容,轉換成對應的對象,ClassNotFoundException 對應類沒有找到。對應的類型沒有導包,不存在…InvalidClassException 類型不一樣序列化之後的每一個類都會有一個serialVersionUID,該編號在使用過程中,序列化和反序列化必須一致
  3. transient 修飾的成員變量不能被序列化
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章