日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

缓冲流、转换流、序列化流

發布時間:2025/3/20 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 缓冲流、转换流、序列化流 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

?

一、緩沖流

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);

?

總結

以上是生活随笔為你收集整理的缓冲流、转换流、序列化流的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。