【java程式設計】IO流之流操作物件
阿新 • • 發佈:2019-01-06
流操作物件的方法:
ObjectInputStream和ObjectOutputStream兩個物件,用ObjectOutputStream儲存的物件只能用ObjectInputStream來進行讀取
Serializable序列化:
每個類在實現Serialiable序列化時,java都會根據該類的成員變數和成員函式來生成一個uid,來區分每一個不同的類,當然,也可以自己手動雲設定這個uid
設定方法為:static final long serialVersionUID = 42L;
Serializable的作用:
當某個類實現了Serializable後,使用ObjectOutputStream把此類所建立的物件儲存到檔案裡,此檔案會生成一個與此類相對應的uid,下次,用ObjectInputStream
讀取此檔案裡的物件時,就會去匹配uid相同的類。如果原來的類改變了,就會生成新的uid,此時,讀取檔案裡的物件時,就會報錯ClassNotFoundException;當然,這
裡,我們也可以固定類的uid,這時,就算檔案裡的物件所對應的類改變了,也一樣可以讀取.
Serializable作用域:
只有儲存在堆記憶體的物件,才能被序列化.如果是儲存在靜態區裡的靜態成員,是不能被序列化的.當然,如果你有不想被序列化的成員,可以在成員前加transient關鍵字
下面來一個流操作物件的例子:
import java.io.*; class ObjectStreamDemo { public static void main(String[] args) throws IOException { readObj(); } //儲存物件到檔案 public static void WriteObj() throws IOException { //建立ObjectOutputStream物件 ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("object.txt")); oos.writeObject(new Person("enen",2)); oos.close(); } //將檔案裡的物件讀取並列印 public static void readObj() throws IOException { //建立ObjectInputStream讀取物件流 ObjectInputStream ois=new ObjectInputStream(new FileInputStream("object.txt")); Person p=null; try { p=(Person)ois.readObject(); } catch (ClassNotFoundException e) { throw new RuntimeException(e.toString()); } System.out.println(p); } } import java.io.*; class Person implements Serializable { String name; int age; Person(String name,int age) { this.name=name; this.age=age; } public String toString() { return name+"::"+age; } }