字符輸出流,緩衝流和序列化
字符輸出流
字符流的應用限制比較多,沒有字節流的應用廣。
主要有以下幾點:
- 字符流不使用close方法的話,文件則不會輸出任何內容。
- 字符流主要是用於處理中文,很方便快捷,但是其他的就不行了,例如音頻、圖片、視頻等。
但是,字符流拷貝文本文件時非常的快!
緩衝流
緩衝流主要是爲了提高整體的讀取、寫入效率,降低了CPU通過內存訪問硬盤的次數。提高效率,降低磁盤損耗。
字節輸入緩衝
BufferedInputStream
字節輸出緩衝
BufferedOutputStream
字符輸入緩衝
BufferedReader
字符輸出緩衝
BufferedWrite
【重點】
- 所有的緩衝流都沒有任何的讀取,寫入文件能力,這裏都需要對應的輸入流和輸出流來提供對應的能力。
- 在創建緩衝流流對象時,需要傳入對應的輸入流對象和輸出流對象。
- 底層就是提供了一個默認大小的緩衝數組,用於提高效率
其中,字節緩衝流的底層中有一個默認容量爲8KB的byte類型緩衝數組。字符緩衝流的底層中有一個默認容量爲16KB的byte類型緩衝數組。
而(字符、字節)輸入緩衝流中fill方法是一個操作核心
- 從硬盤中讀取數據,讀取的數據容量和緩衝數組容量一致。
- 所有的read方法,都是從緩衝數組中讀取數據
- 每一次讀取數據之前,都會檢查緩衝區內是否有數據,如果沒有,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類
從文件中讀取被序列化之後的字節數據,提供反序列化操作,得到一個對象。
【序列化注意事項】
- 如果一個類需要進行序列化操作,必須遵從。java.io.Serializable。不遵從無法進行序列化操作
- 序列化之後從文件中讀取序列化內容,轉換成對應的對象,ClassNotFoundException 對應類沒有找到。對應的類型沒有導包,不存在…InvalidClassException 類型不一樣序列化之後的每一個類都會有一個serialVersionUID,該編號在使用過程中,序列化和反序列化必須一致
- transient 修飾的成員變量不能被序列化