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物件的內容。