更新時間:2020-11-18 17:14:44 來源:動力節點 瀏覽1117次
在正式介紹 IO流中的序列化流與反序列化流之前,我們先來看看何謂序列化和反序列化:
序列化:用一個字節序列可以表示一個對象,該字節序列包含該對象的數據、對象的類型和對象中存儲的屬性等信息。字節序列寫出到文件之后,相當于文件中持久保存了一個對象的信息。
反序列化:該字節序列還可以從文件中讀取回來,重構對象,對它進行反序列化。對象的數據、對象的類型和對象中存儲的數據信息,都可以用來在內存中創建對象。
用于從流中讀取對象的操作流 ObjectInputStream 稱為 反序列化流
用于向流中寫入對象的操作流 ObjectOutputStream 稱為 序列化流
用于操作對象。可以將對象寫入到文件中,也可以從文件中讀取對象。
一、在序列化概念的基礎之上我們再來看對象序列化流ObjectOutputStream:
ObjectOutputStream將Java 對象的基本數據類型和圖形寫入 OutputStream。可以使用 ObjectInputStream 讀取(重構)對象。通過在流中使用文件可以實現對象的持久存儲。
需要注意的是對象序列化流只能將支持 java.io.Serializable 接口的對象寫入流中。
java.io.ObjectOutputStream extends OutputStream
ObjectOutputStream:對象的序列化流
作用:
把對象以流的方式寫入到文件中保存
構造方法:
ObjectOutputStream(OutputStream out) 創建寫入指定 OutputStream 的 ObjectOutputStream。
參數:
OutputStream out:字節輸出流
特有的成員方法:
void writeObject(Object obj) 將指定的對象寫入 ObjectOutputStream。
使用步驟:
1.創建ObjectOutputStream對象,構造方法中傳遞字節輸出流
2.使用ObjectOutputStream對象中的方法writeObject,把對象寫入到文件中
3.釋放資源
代碼演示:
public class ObjectStreamDemo {
public static void main(String[] args) throws IOException, ClassNotFoundException {
/*
* 將一個對象存儲到持久化(硬盤)的設備上。
*/
writeObj();//對象的序列化。
}
public static void writeObj() throws IOException {
//1,明確存儲對象的文件。
FileOutputStream fos = new FileOutputStream("tempfile\\obj.object");
//2,給操作文件對象加入寫入對象功能。
ObjectOutputStream oos = new ObjectOutputStream(fos);
//3,調用了寫入對象的方法。
oos.writeObject(new Person("wangcai",20));
//關閉資源。
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 寫入的基本數據和對象進行反序列化。支持 java.io.Serializable接口的對象才能從流讀取。
java.io.ObjectInputStream extends InputStream
ObjectInputStream:對象的反序列化流
作用:
把文件中保存的對象,以流的方式讀取出來使用
構造方法:
ObjectInputStream(InputStream in) 創建從指定 InputStream 讀取的 ObjectInputStream。
參數:
InputStream in:字節輸入流
特有的成員方法:
Object readObject() 從 ObjectInputStream 讀取對象。
使用步驟:
1.創建ObjectInputStream對象,構造方法中傳遞字節輸入流
2.使用ObjectInputStream對象中的方法readObject讀取保存對象的文件
3.釋放資源
4.使用讀取出來的對象(打印)
readObject方法聲明拋出了ClassNotFoundException(class文件找不到異常)
當不存在對象的class文件時拋出此異常
反序列化的前提:
1.類必須實現Serializable
2.必須存在類對應的class文件
代碼演示:
public class ObjectStreamDemo {
public static void main(String[] args) throws IOException, ClassNotFoundException {
readObj();//對象的反序列化。
}
public static void readObj() throws IOException, ClassNotFoundException {
//1,定義流對象關聯存儲了對象文件。
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學習中的一個大的版塊,我們只是初窺門徑,想要學好IO流我們任重而道遠。觀看本站的Java 基礎教程,為你的學習之路更進一步!
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習