更新時間:2020-11-18 17:14:44 來源:動力節(jié)點 瀏覽1157次
在正式介紹 IO流中的序列化流與反序列化流之前,我們先來看看何謂序列化和反序列化:
序列化:用一個字節(jié)序列可以表示一個對象,該字節(jié)序列包含該對象的數(shù)據(jù)、對象的類型和對象中存儲的屬性等信息。字節(jié)序列寫出到文件之后,相當(dāng)于文件中持久保存了一個對象的信息。
反序列化:該字節(jié)序列還可以從文件中讀取回來,重構(gòu)對象,對它進行反序列化。對象的數(shù)據(jù)、對象的類型和對象中存儲的數(shù)據(jù)信息,都可以用來在內(nèi)存中創(chuàng)建對象。
用于從流中讀取對象的操作流 ObjectInputStream 稱為 反序列化流
用于向流中寫入對象的操作流 ObjectOutputStream 稱為 序列化流
用于操作對象。可以將對象寫入到文件中,也可以從文件中讀取對象。
一、在序列化概念的基礎(chǔ)之上我們再來看對象序列化流ObjectOutputStream:
ObjectOutputStream將Java 對象的基本數(shù)據(jù)類型和圖形寫入 OutputStream。可以使用 ObjectInputStream 讀取(重構(gòu))對象。通過在流中使用文件可以實現(xiàn)對象的持久存儲。
需要注意的是對象序列化流只能將支持 java.io.Serializable 接口的對象寫入流中。
java.io.ObjectOutputStream extends OutputStream
ObjectOutputStream:對象的序列化流
作用:
把對象以流的方式寫入到文件中保存
構(gòu)造方法:
ObjectOutputStream(OutputStream out) 創(chuàng)建寫入指定 OutputStream 的 ObjectOutputStream。
參數(shù):
OutputStream out:字節(jié)輸出流
特有的成員方法:
void writeObject(Object obj) 將指定的對象寫入 ObjectOutputStream。
使用步驟:
1.創(chuàng)建ObjectOutputStream對象,構(gòu)造方法中傳遞字節(jié)輸出流
2.使用ObjectOutputStream對象中的方法writeObject,把對象寫入到文件中
3.釋放資源
代碼演示:
public class ObjectStreamDemo {
public static void main(String[] args) throws IOException, ClassNotFoundException {
/*
* 將一個對象存儲到持久化(硬盤)的設(shè)備上。
*/
writeObj();//對象的序列化。
}
public static void writeObj() throws IOException {
//1,明確存儲對象的文件。
FileOutputStream fos = new FileOutputStream("tempfile\\obj.object");
//2,給操作文件對象加入寫入對象功能。
ObjectOutputStream oos = new ObjectOutputStream(fos);
//3,調(diào)用了寫入對象的方法。
oos.writeObject(new Person("wangcai",20));
//關(guān)閉資源。
oos.close();
}
}
Person類
public class Person implements Serializable {
private String name;
private int age;
public Person() {
super();
}
public Person(String name, int age) {
super();
this.name = name;
this.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;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
二、同理,我們再來看對象反序列化流ObjectInputStream
ObjectInputStream 對以前使用 ObjectOutputStream 寫入的基本數(shù)據(jù)和對象進行反序列化。支持 java.io.Serializable接口的對象才能從流讀取。
java.io.ObjectInputStream extends InputStream
ObjectInputStream:對象的反序列化流
作用:
把文件中保存的對象,以流的方式讀取出來使用
構(gòu)造方法:
ObjectInputStream(InputStream in) 創(chuàng)建從指定 InputStream 讀取的 ObjectInputStream。
參數(shù):
InputStream in:字節(jié)輸入流
特有的成員方法:
Object readObject() 從 ObjectInputStream 讀取對象。
使用步驟:
1.創(chuàng)建ObjectInputStream對象,構(gòu)造方法中傳遞字節(jié)輸入流
2.使用ObjectInputStream對象中的方法readObject讀取保存對象的文件
3.釋放資源
4.使用讀取出來的對象(打印)
readObject方法聲明拋出了ClassNotFoundException(class文件找不到異常)
當(dāng)不存在對象的class文件時拋出此異常
反序列化的前提:
1.類必須實現(xiàn)Serializable
2.必須存在類對應(yīng)的class文件
代碼演示:
public class ObjectStreamDemo {
public static void main(String[] args) throws IOException, ClassNotFoundException {
readObj();//對象的反序列化。
}
public static void readObj() throws IOException, ClassNotFoundException {
//1,定義流對象關(guān)聯(lián)存儲了對象文件。
FileInputStream fis = new FileInputStream("tempfile\\obj.object");
//2,建立用于讀取對象的功能對象。
ObjectInputStream ois = new ObjectInputStream(fis);
Person obj = (Person)ois.readObject();
System.out.println(obj.toString());
}
}
本文我們只是對IO流中的對象反序列化流和對象序列化流做了初步的了解,了解了對象反序列化流和對象序列化流的基本概念和簡單的用法。IO流作為Java學(xué)習(xí)中的一個大的版塊,我們只是初窺門徑,想要學(xué)好IO流我們?nèi)沃囟肋h。觀看本站的Java 基礎(chǔ)教程,為你的學(xué)習(xí)之路更進一步!