10 緩衝流(高效流)、轉換流、序列化流、IO總結

一、緩衝流(高效流)

1.緩衝流,也叫高效流,是對4個基本的 FileXxx 流的增強,所以也是4個流,按照數據類型分類:

字節緩衝流: BufferedInputStream , BufferedOutputStream

字符緩衝流: BufferedReader , BufferedWriter

2.原理

緩衝流創建對象的時候,有一個緩衝區數組,通過緩衝區數組讀取,效率大大提升

3.字符緩衝流需注意的兩個方法

BufferedReader: public String readLine() : 讀一行文字。

BufferedWriter: public void newLine() : 寫一行行分隔符,由系統屬性定義符號。

 

基礎練習

對以下文本按序號排序(注意每個數字後面的文本必須在一行)

3.侍中、侍郎郭攸之、費禕、董允等,此皆良實,志慮忠純,是以先帝簡拔以遺陛下。愚以爲宮中之事,事無大小,悉以諮之,然後施行,必得裨補闕漏,有所廣益。
8.願陛下託臣以討賊興復之效,不效,則治臣之罪,以告先帝之靈。若無興德之言,則責攸之、禕、允等之慢,以彰其咎;陛下亦宜自謀,以諮諏善道,察納雅言,深追先帝遺詔,臣不勝受恩感激。
4.將軍向寵,性行淑均,曉暢軍事,試用之於昔日,先帝稱之曰能,是以衆議舉寵爲督。愚以爲營中之事,悉以諮之,必能使行陣和睦,優劣得所。
2.宮中府中,俱爲一體,陟罰臧否,不宜異同。若有作奸犯科及爲忠善者,宜付有司論其刑賞,以昭陛下平明之理,不宜偏私,使內外異法也。
1.先帝創業未半而中道崩殂,今天下三分,益州疲弊,此誠危急存亡之秋也。然侍衛之臣不懈於內,忠志之士忘身於外者,蓋追先帝之殊遇,欲報之於陛下也。誠宜開張聖聽,以光先帝遺德,恢弘志士之氣,不宜妄自菲薄,引喻失義,以塞忠諫之路也。
9.今當遠離,臨表涕零,不知所言。
6.臣本布衣,躬耕於南陽,苟全性命於亂世,不求聞達於諸侯。先帝不以臣卑鄙,猥自枉屈,三顧臣於草廬之中,諮臣以當世之事,由是感激,遂許先帝以驅馳。後值傾覆,受任於敗軍之際,奉命於危難之間,爾來二十有一年矣。
7.先帝知臣謹慎,故臨崩寄臣以大事也。受命以來,夙夜憂嘆,恐付託不效,以傷先帝之明,故五月渡瀘,深入不毛。今南方已定,兵甲已足,當獎率三軍,北定中原,庶竭駑鈍,攘除奸兇,興復漢室,還於舊都。此臣所以報先帝而忠陛下之職分也。至於斟酌損益,進盡忠言,則攸之、禕、允之任也。
5.親賢臣,遠小人,此先漢所以興隆也;親小人,遠賢臣,此後漢所以傾頹也。先帝在時,每與臣論此事,未嘗不嘆息痛恨於桓、靈也。侍中、尚書、長史、參軍,此悉貞良死節之臣,願陛下親之信之,則漢室之隆,可計日而待也。
package cn.itcast.test;

import java.io.*;
import java.util.HashMap;
import java.util.Set;

public class Test {
    public static void main(String[] args) throws IOException {
        //創建map來存儲數據信息
        HashMap<String, String> map = new HashMap<>();
        //創建緩衝字符輸入流,讀取數據到內存(或者程序)
        BufferedReader br = new BufferedReader(new FileReader("day10\\file.txt"));
        //創建緩衝字符輸出流,寫數據到另一文件
        BufferedWriter bw = new BufferedWriter(new FileWriter("day10\\chengeFile.txt"));
        //讀取數據
        String line;
        while ((line = br.readLine()) != null) {
            String[] split = line.split("\\.", 2);
            map.put(split[0], split[1]);
        }
        Set<String> set = map.keySet();
        for (int i = 1; i <= set.size(); i++) {
            //寫入數據
            String str = i + "." + map.get(i+"");
            bw.write(str);
            bw.newLine();
        }
        br.close();
        bw.close();

    }
}

二、轉換流

1.編碼?

字符  按照一定的規則   變爲字節;

2.解碼?

字節 按照一定的規則   變爲  字符;

3.爲什麼會發生亂碼?

編碼和解碼的規則不一樣;

4.常見字符碼錶?

        ASCII碼錶:

        GBK;(一個漢字佔用兩個字節)

        UTF-8;(一個漢字佔用三個字節)

        ISO-8859-1:

5.轉換流能解決什麼問題?

亂碼問題

由於轉換流可以指定編碼表,那麼它就可以保證我們讀寫的時候(編碼和解碼的規則一樣);

三、序列化流

1. 一個對象要想序列化,必須滿足兩個條件:

a.該類必須實現 java.io.Serializable 接口, Serializable 是一個標記接口,不實現此接口的類將不會使任

何狀態序列化或反序列化,會拋出 NotSerializableException 。

b.該類的所有屬性必須是可序列化的。如果有一個屬性不需要可序列化的,則該屬性必須註明是瞬態的,使用

transient 關鍵字修飾。

2.反序列化操作

如果能找到一個對象的class文件,我們可以進行反序列化操作,調用 ObjectInputStream 讀取對象的方法:

public final Object readObject () : 讀取一個對象。

當JVM反序列化對象時,能找到class文件,但是class文件在序列化對象之後發生了修改,那麼反序列化操

作也會失敗,如果需要修改,則必須給序列化類一個版本號serialVersionUID

 

3.重要總結

如果一個class在反序列化前被修改,但是我還想要得到反序列化修改之後的class,那麼在序列化之前,我需要給這個類添加序列化版本serialVersionUID

 

 

序列化練習

1. 將存有多個自定義對象的集合序列化操作,保存到 list.txt 文件中。

2. 反序列化 list.txt ,並遍歷集合,打印對象信息。

Person類

package cn.itcast.test01;

import java.io.Serializable;

public class Person implements Serializable {
    private static final long serialVersionUID = -8289499667595781797L;
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "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;
    }
}

Test類

package cn.itcast.test01;

import java.io.*;
import java.util.ArrayList;

public class Test {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //1. 將存有多個自定義對象的集合序列化操作,保存到 list.txt 文件中。

        ArrayList<Person> list = new ArrayList<>();
        list.add(new Person("張三",20));
        list.add(new Person("李四",21));
        list.add(new Person("王五",23));
        //把集合對象序列化到list.txt文件中
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("day10\\list.txt"));
        oos.writeObject(list);
        //2. 反序列化 list.txt ,並遍歷集合,打印對象信息。
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("day10\\list.txt"));
        Object o = ois.readObject();
        ArrayList<Person> list1 = (ArrayList<Person>)o;
        for (Person person : list) {
            System.out.println(person);
        }
    }
}

IO流總結

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章