缓冲流、转换流、序列化流
目錄
?
一、緩沖流
1.緩沖流的作用
2.緩沖流的分類
3.字節緩沖流的介紹和使用
4.字符緩沖流的介紹和使用
5.綜合練習:文本排序
二、轉換流
1.字符編碼
2.字符集
3.編碼引出的問題
4.InputStreamReader類
5.OutputStreamWriter類
三、序列化流
1.什么是序列化流
2.ObjectOutputStream類的使用
(1)構造方法
(2)序列化操作的前提
(3)寫出對象方法
3.ObjectInputStream類的使用
(1)構造方法
(2)反序列化操作的異常分析
(3)讀取對象方法
4.序列化多個對象練習
四、打印流PrintStream
1.介紹
2. 構造方法
3.小練習:改變打印流向
一、緩沖流
1.緩沖流的作用
緩沖流又叫增強流,用來給四大基本流做性能方面的加強。
2.緩沖流的分類
字節緩沖流: BufferedInputStream , BufferedOutputStream
字符緩沖流: BufferedReader , BufferedWriter
3.字節緩沖流的介紹和使用
(1)字節緩沖流的構造
public BufferedInputStream(InputStream in) :創建一個 新的緩沖輸入流。
public BufferedOutputStream(OutputStream out) : 創建一個新的緩沖輸出流。
4.字符緩沖流的介紹和使用
(1)字符緩沖流的構造
public BufferedReader(Reader in)?:創建一個 新的緩沖輸入流。
public BufferedWriter(Writer out)?: 創建一個新的緩沖輸出流。
(2)特有方法
BufferedReader: public String readLine()?: 讀一行文字。
BufferedWriter: public void newLine()?: 寫一行行分隔符,由系統屬性定義符號。
5.綜合練習:文本排序
HashMap<String, String> linemap = new HashMap<>();//創建流對象try (BufferedReader br = new BufferedReader(new FileReader("出師表"));BufferedWriter bw = new BufferedWriter(new FileWriter("出師表02.txt"));) {String line = null;//讀取數據while ((line = br.readLine()) != null) {//解析文本String[] split = line.split("\\.");//保存到集合linemap.put(split[0], split[1]);}//遍歷集合for (int i = 1; i <= linemap.size(); i++) {//獲取map中文本String value = linemap.get(String.valueOf(i));//寫出拼接文本bw.write(i + "." + value);//換行bw.newLine();}} catch (IOException e) {e.printStackTrace();}二、轉換流
1.字符編碼
就是一套自然語言的字符與二進制數之間的對應規則。
編碼:字符通過編碼轉成對應的碼值(看的懂的變為看不懂的)
解碼:碼值通過解碼轉成對應的字符(看不懂的變為看的懂的)
2.字符集
是一個系統支持的所有字符的集合,包括各國家文字、標點符號、圖形符號、數字等。
3.編碼引出的問題
在IDEA中,使用FileReader 讀取項目中的文本文件。由于IDEA的設置,都是默認的UTF-8 編碼,所以沒有任何問題。但是,當讀取Windows系統中創建的文本文件時,由于Windows系統的默認是GBK編碼,就會出現亂碼。
4.InputStreamReader類
轉換流java.io.InputStreamReader ,是Reader的子類,是從字節流到字符流的橋梁。
(1)構造方法
InputStreamReader(InputStream in)?: 創建一個使用默認字符集的字符流。
InputStreamReader(InputStream in, String charsetName) : 創建一個指定字符集的字符流。
5.OutputStreamWriter類
轉換流java.io.OutputStreamWriter ,是Writer的子類,是從字符流到字節流的橋梁。
(1)構造方法
OutputStreamWriter(OutputStream in)?: 創建一個使用默認字符集的字符流。
OutputStreamWriter(OutputStream in, String charsetName)?: 創建一個指定字符集的字符流。
三、序列化流
1.什么是序列化流
Java 提供了一種對象序列化的機制。用一個字節序列可以表示一個對象,該字節序列包含該對象的數據、對象的類型和對象中存儲的數據等信息。字節序列寫出到文件之后,相當于文件中持久保存了一個對象的信息。
反之,該字節序列還可以從文件中讀取回來,重構對象,對它進行反序列化。
2.ObjectOutputStream類的使用
(1)構造方法
public ObjectOutputStream(OutputStream out) : 創建一個指定OutputStream的ObjectOutputStream。
(2)序列化操作的前提
一個對象要想序列化,必須滿足兩個條件:
①該類必須實現java.io.Serializable 接口, Serializable 是一個標記接口,不實現此接口的類將不會使任何狀態序列化或反序列化,會拋出NotSerializableException 。
②該類的所有屬性必須是可序列化的。如果有一個屬性不需要可序列化的,則該屬性必須注明是瞬態的,使用transient 關鍵字修飾。
(3)寫出對象方法
public final void writeObject (Object obj)?: 將指定的對象寫出。
3.ObjectInputStream類的使用
(1)構造方法
public ObjectInputStream(InputStream in)?: 創建一個指定InputStream的ObjectInputStream。
(2)反序列化操作的異常分析
①InvalidClassException異常
當JVM反序列化對象時,能找到class文件,但是class文件在序列化對象之后發生了修改,那么反序列化操作也會失敗,拋出一個InvalidClassException 異常。發生這個異常的原因如下:
A.該類的序列版本號與從流中讀取的類描述符的版本號不匹配
B.該類包含未知數據類型
C.該類沒有可訪問的無參數構造方法
Serializable 接口給需要序列化的類,提供了一個序列版本號。serialVersionUID 該版本號的目的在于驗證序列化的對象和對應類是否版本匹配。
②ClassNotFoundException異常
序列化前后,被序列化類被刪除了。
(3)讀取對象方法
public final Object readObject () : 讀取一個對象。
4.序列化多個對象練習
分析:
(1)把若干學習對象 ,保存到集合中。
(2)把集合序列化。
(3)反序列化讀取時,只需要讀取一次,轉換為集合類型。
(4)遍歷集合,可以打印所有的學生信息
代碼如下:
public class Student implements Serializable {private static final long serialVersionUID = 8002194731998770433L;private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;} } public static void main(String[] args) throws Exception {// 創建 學生對象Student student = new Student("老王", 20);Student student2 = new Student("老張", 22);Student student3 = new Student("老李", 24);ArrayList<Student> arrayList = new ArrayList<>();arrayList.add(student);arrayList.add(student2);arrayList.add(student3);// 序列化操作serializ(arrayList);// 反序列化ObjectInputStream ois = new ObjectInputStream(new FileInputStream("list.txt"));// 讀取對象,強轉為ArrayList類型ArrayList<Student> list = (ArrayList<Student>) ois.readObject();for (int i = 0; i < list.size(); i++) {Student s = list.get(i);System.out.println(s.getName() + "‐‐" + s.getAge());}}private static void serializ(ArrayList<Student> arrayList) throws Exception {// 創建 序列化流ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("list.txt"));// 寫出對象oos.writeObject(arrayList);// 釋放資源oos.close();}四、打印流PrintStream
1.介紹
作用:用來打印各種數據類型
特點:
? ? ? ? ?a.永遠不會拋出IOException
? ? ? ? ?b.不需要關心字符字節,打印什么就是什么
2. 構造方法
public PrintStream(String fileName)?: 使用指定的文件名創建一個新的打印流。
PrintStream(OutputStream out): 創建一個新的打印流。
PrintStream(File file): 使用指定的文件創建一個新的打印流。
3.小練習:改變打印流向
// 調用系統的打印流,控制臺直接輸出97System.out.println(97);// 創建打印流,指定文件的名稱PrintStream ps = new PrintStream("ps.txt");// 設置系統的打印流流向,輸出到ps.txtSystem.setOut(ps);// 調用系統的打印流,ps.txt中輸出97System.out.println(97);?
總結
以上是生活随笔為你收集整理的缓冲流、转换流、序列化流的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 字节流、字符流
- 下一篇: 缓冲流、转换流、序列化流代码练习