JAVA基礎學習總結,day20(IO流進階)

高效流/緩衝流

原理:是在創建對象是,會創建一個內置的默認大小的緩衝區數組,通過緩衝區讀寫 ,減少系統IO次數,從而提高讀寫的效率

BufferedInputStream 間接繼承 InputStream
BufferedOutputStream 間接繼承 OutputStream

字節緩衝流
構造方法:
public BufferedInputStream(InputStream in) :創建一個 新的緩衝輸入流。
public BufferedOutputStream(OutputStream out) : 創建一個新的緩衝輸出流。

// 創建字節緩衝輸入流
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("bis.txt"));
// 創建字節緩衝輸出流
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("bos.txt"));

普通流FileInputStream 慢於 BufferedInputStream 慢於 FileInputSteam 的數組流

符緩衝流
構造方法public BufferedReader(Reader in) :創建一個 新的緩衝輸入流。
public BufferedWriter(Writer out) : 創建一個新的緩衝輸出流。

特有方法
BufferedReader: public String readLine() : 讀一行文字。
BufferedWriter: public void newLine() : 寫一行行分隔符,由系統屬性定義符號。

轉換流
字符編碼 Character Encoding :就是一套自然語言的字符與二進制數之間的對應規則
字符集 Charset :是一個系統支持的所有字符的集合

InputStreamReader 子類:(字符輸入流)轉換流InputStreamReader , 是Reader的子類,是從字節流到字符流的橋樑
它讀取字節,並使用指定的字符集將其解碼爲字符,它的字符集可以由名稱指定,也可以接受平臺的默認字符集

gbk: 中文佔兩個字節
utf8: 中文佔三個字節

構造方法
InputStreamReader(InputStream in) : 創建一個使用默認字符集的字符流。在idea中默認就是utf-8編碼(把字節流轉換爲字符流)
InputStreamReader(InputStream in, String charsetName) : 創建一個指定字符集的字符流。(把字節流轉換爲字符流)charseName:指定解析編碼

OutputStreamWriter 子類 (字符輸出流)轉換流 java.io.OutputStreamWriter ,是Writer的子類,是從字符流到字節流的橋樑。使用指定的字符集講字符 編碼爲字節。它的字符集可以由名稱指定,也可以接受平臺的默認字符集。
構造方法
OutputStreamWriter(OutputStream in) : 創建一個使用默認字符集的字符流。idea中默認的字符集是utf-8
OutputStreamWriter(OutputStream in, String charsetName) : 創建一個指定字符集的字符流。

序列化流
序列化:ObiectOutputStream 把對象轉換爲字節保存到文件中 java.io.ObjectOutputStream 類,將java對象的原始數據類型寫出到文件,實現對象的持久存儲。

構造方法
public ObjectOutputStream(OutputStream out) : 創建一個指定OutputStream的ObjectOutputStream。

寫出對象方法
public final void writeObject (Object obj) : 將指定的對象寫出。

Student str1=new Student("張三",18,"男");
Student str2=new Student("李四",23,"男");
Student str3=new Student("王小丫",21,"女");
Student str4=new Student("趙六",20,"男");
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("day10\\stu.txt"));
oos.writeObject(str1);
oos.writeObject(str2);
oos.writeObject(str3);
oos.writeObject(str4);
oos.close();

序列化操作注意事項
一個對象要想序列化,必須滿足兩個條件:
該類必須實現 java.io.Serializable 接口, Serializable 是一個標記接口,不實現此接口的類將不會使任 何狀態序列化或反序列化,會拋出 NotSerializableException 異常。
該類的所有屬性必須是可序列化的。如果有一個屬性不需要可序列化的,則該屬性必須註明是瞬態的,使用 transient 關鍵字修飾。

反序列化:ObjectInputStream 把字節重構成對象
ObjectInputStream反序列化流,將之前使用
ObjectOutputStream 序列化的原始數據恢復爲對象

構造方法
public ObjectInputStream(InputStream in) : 創建一個指定InputStream的ObjectInputStream

常用方法:
public final Object readObject () : 讀取一個對象。
ObjectInputStream ois=new ObjectInputStream(new FileInputStream(“day10\stu.txt”));
Object object1 =ois.readObject();

try {    
  while (true){        
    System.out.println(object1);        
    Object object2 = ois.readObject();    
  }
}catch (Exception a){
}
ois.close();

反序列化操作注意事項:
1.對於JVM可以反序列化對象,它必須是能夠找到class文件的類。如果找不到該類的class文件,則拋出一個 ClassNotFoundException 異常
2.當JVM反序列化對象時,能找到class文件,但是class文件在序列化對象之後發生了修改,那麼反序列化操 作也會失敗,拋出一個 InvalidClassException 異常。

解決方案:
Serializable 接口給需要序列化的類,提供了一個序列版本號
serialVersionUID 該版本號的目的在於驗證序列化的對象和對應類是否版本匹配

打印流
java.io.PrintStream類,該類能夠方便地打印各種數據類型的值,是一種便捷的輸出方式。

構造方法
public PrintStream(String fileName): 使用指定的文件名創建一個新的打印流
改變打印流向
System.out 就是PrintStream類型的,只不過它的流向是系統規定的,打印在控制檯上。不過我們可以改變它的流向。

//創建一個文本掃描器,用來鍵盤輸入
Scanner scan=new Scanner(System.in);
//提示輸入一行字符串
System.out.println("請輸入一行字符串:");
//接收鍵盤輸入的字符串
String s = scan.nextLine();
//創建一個打印流路徑文件
PrintStream ps=new PrintStream("day10\\d.txt");
//打印到文件
ps.println(s);
//指定打印位置,
d.txt文件System.setOut(ps);
//把鍵盤接收的字符串打印
System.out.print(s);
發佈了28 篇原創文章 · 獲贊 13 · 訪問量 1789
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章