1. 程式人生 > >Java IO 筆記 3 --- 物件流

Java IO 筆記 3 --- 物件流

如果想整個的存入,讀取,自定義的物件,就用到了,操作物件的流 — ObjectOutputStream, ObjectInputStream,被操作的物件,要實現 Serializable(標記介面)

注:流裡面的一對,不是兩個,是輸入和輸出相對應

1 Serializable

Serializable 用於給被序列化的類,加入 ID號,用於判斷 類和物件,是否是同一個版本

2 ObjectOutputStream ObjectInputStream

2.1 ObjectOutputStream

ObjectOutputStream: 物件的序列化 — 序列化,就是對寫入的多個物件,進行排序

我們想把資料,以物件的形式寫入到硬碟,但是寫入硬碟的資料是檔案,怎麼轉成物件 1 先把資料寫入硬碟 new FileOutputStream("obj.object") 2 把寫入的資料,變為物件 new ObjectOutputStream() 直接寫出來,就是 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("obj.object")); 3 呼叫 ObjectOutputStream的 writeObject()方法,實現 物件資料的寫入 oos.writeObject(new Person("小強",30)); // 注:被序列化的物件 必須實現 Serializable介面

oos.close();

注:在標準開發中,儲存物件的檔案,不能用 txt 為字尾,其標準字尾名為 .object

2.2 ObjectIutputStream

資料儲存起來了,怎麼讀出來,如果用以前的方法,FileInputStream 能把裡面存的資料讀出來,但是不能把物件讀出來,用 ObjectIutputStream

ObjectInputStream ois = new ObjectInputStream(new FileInputStream("obj.object"));
//物件的反序列化 
Person p = (Person)ois.readObject
(); System.out.println(p.getName()+":"+p.getAge()); ois.close();

3 例項程式碼

Student 類 — 必須實現 Serializable介面

public class Student implements Serializable {

    private String name;
    private int age;

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

    public String toString(){
        return "Student [name=" + name + ", age=" + age + "]";
    }
}

物件流程式碼

public class ObjectStreamDemo {


    public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {

        ObjectOutputStream oos = new ObjectOutputStream(
                new FileOutputStream("E:"+ File.separator+"test2.object"));

        oos.writeObject(new Student("張三",21));
        oos.writeObject(new Student("lisi",22));
        oos.writeObject(new Student("趙二",23));


        ObjectInputStream ois = new ObjectInputStream(
                new FileInputStream("E:"+ File.separator+"test2.object"));

        for(int i=0;i<3;i++){
            System.out.println(ois.readObject());
        }
    }

}

輸出結果

Student [name=張三, age=21]
Student [name=lisi, age=22]
Student [name=趙二, age=23]

4 ObjectOutputStream 用writeObject()輸出文字是亂碼 問題

找到寫的檔案,開啟,看到裡面的內容為

sr IODemo.Student?翎
? I ageL namet Ljava/lang/String;xp   t zhangsansq ~     t lisisq ~     t zhaoer

第一眼感覺是亂碼,其實這不是亂碼。 ObjectOutputStream.writeObject()的作用是把一個例項的物件以檔案的形式儲存到磁碟上,這個過程就叫Java物件的持久化。 而這個檔案是以二進位制的形式編寫的,當你用文字編輯器將它開啟,這些二進位制程式碼與某個字符集對映之後,顯示出來的東西就成了亂碼。 即使輸出的是一個String的物件,也是以該String物件的二進位制編碼的形式輸出,而不是輸出String物件的內容。