ObjectOutputStream 和 ObjectInputStream的使用
一、看一下API文檔
ObjectOutputStream :
ObjectOutputStream 將 Java 對象的基本數據類型和圖形寫入 OutputStream。可以使用 ObjectInputStream 讀取(重構)對象。通過在流中使用文件可以實現對象的持久存儲。如果流是網絡套接字流,則可以在另一臺主機上或另一個進程中重構對象。
只能將支持 java.io.Serializable 接口的對象寫入流中。每個 serializable 對象的類都被編碼,編碼內容包括類名和類簽名、對象的字段值和數組值,以及從初始對象中引用的其他所有對象的閉包。
writeObject 方法用于將對象寫入流中。所有對象(包括 String 和數組)都可以通過 writeObject 寫入。可將多個對象或基元寫入流中。必須使用與寫入對象時相同的類型和順序從相應 ObjectInputstream 中讀回對象。
還可以使用 DataOutput 中的適當方法將基本數據類型寫入流中。還可以使用 writeUTF 方法寫入字符串。
對象的默認序列化機制寫入的內容是:對象的類,類簽名,以及非瞬態和非靜態字段的值。其他對象的引用(瞬態和靜態字段除外)也會導致寫入那些對象。可使用引用共享機制對單個對象的多個引用進行編碼,這樣即可將對象的圖形恢復為最初寫入它們時的形狀。
ObjectInputStream :
ObjectInputStream 對以前使用 ObjectOutputStream 寫入的基本數據和對象進行反序列化。
ObjectOutputStream 和 ObjectInputStream 分別與 FileOutputStream 和 FileInputStream 一起使用時,可以為應用程序提供對對象圖形的持久存儲。ObjectInputStream 用于恢復那些以前序列化的對象。其他用途包括使用套接字流在主機之間傳遞對象,或者用于編組和解組遠程通信系統中的實參和形參。
ObjectInputStream 確保從流創建的圖形中所有對象的類型與 Java 虛擬機中顯示的類相匹配。使用標準機制按需加載類。
只有支持 java.io.Serializable 或 java.io.Externalizable 接口的對象才能從流讀取。?
二、案例說明
下面以一個例子來說明:首先定義一個學生類,主要用于后面的封裝。
//ObjectInputStream與ObjectOutputStream類所讀寫的對象必須實現Serializable接口,對象中的transient和static類型成員變量不會被讀取和寫入public class Student implements Serializable {private static final long serialVersionUID = -187877186941003078L;String name;int id;transient int age; // transient 瞬時的,不持久化. 此處若把transient加上,就可以單獨不對age進行持久化操作transient int ageString department;public Student(String name, int id, int age, String department) {this.age = age;this.department = department;this.id = id;this.name = name;}@Overridepublic String toString() {return "Student [name=" + name + ", id=" + id + ", age=" + age+ ", department=" + department + "]";}}然后把serializtion寫上就可以了。
//對象輸入輸出流,對象持久化操作,字節流的子類 public class Serializtion {public static void main(String[] args) throws IOException {Student s1 = new Student("張三", 1, 20, "數據結構");Student s2 = new Student("李四", 2, 19, "網絡");List<Student> list=new ArrayList<Student>();list.add( s1);list.add(s2);/*ObjectOutputStream 和 ObjectInputStream 分別與 FileOutputStream 和FileInputStream 一起使用時,可以為應用程序提供對對象圖形的持久存儲。*/// 將學生信息封裝到student.txt中// 創建一個向 student.txt 的文件中寫入數據的文件輸出流。FileOutputStream fout = new FileOutputStream("student2.txt");//ObjectOutputStream 將 Java 對象的基本數據類型和圖形寫入 OutputStream。可以使用 ObjectInputStream 讀取(重構)對象。ObjectOutputStream out = new ObjectOutputStream(fout);//writeObject 方法負責寫入特定類的對象狀態,以便相應的 readObject 方法可以恢復它。out.writeObject(list);//FileInputStream?類從文件系統中的一個文件中獲取輸入字節。FileInputStream fin = new FileInputStream("student2.txt");//創建從指定 InputStream 讀取的 ObjectInputStream。從流讀取序列化頭部并予以驗證。ObjectInputStream in = new ObjectInputStream(fin); // 捕獲異常try {/* readObject 方法為類重寫默認的反序列化readObject 方法用于從流讀取對象。應該使用 Java 的安全強制轉換來獲取所需的類型。在 Java 中,字符串和數組都是對象,所以在序列化期間將其視為對象。讀取時,需要將其強制轉換為期望的類型。*/List<Student> l= (List<Student>) in.readObject();for( Student s: l){System.out.println( s );}} catch (ClassNotFoundException e) {e.printStackTrace();}// 關閉流out.close();in.close();} }最后會輸出:
name:張三id:1age:20department:數據結構
name:李四id:2age:19department:網絡
總結
以上是生活随笔為你收集整理的ObjectOutputStream 和 ObjectInputStream的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 字符集和编码
- 下一篇: Spring和Mybatis整合,配置文