IO流第七課物件處理流
阿新 • • 發佈:2018-11-12
這節課我們來講物件處理流,首先來說說兩個概念: 序列化和反序列化
以下內容摘自菜鳥教程:
Java 提供了一種物件序列化的機制,該機制中,一個物件可以被表示為一個位元組序列,該位元組序列包括該物件的資料、有關物件的型別的資訊和儲存在物件中資料的型別。
將序列化物件寫入檔案之後,可以從檔案中讀取出來,並且對它進行反序列化,也就是說,物件的型別資訊、物件的資料,還有物件中的資料型別可以用來在記憶體中新建物件。
通俗來講:
將物件寫到檔案裡就叫序列化,從檔案裡讀取出一個物件叫反序列化
注意:
- 不是所有物件都可以序列化,只有實現了java.io.Serializable介面的類的物件可以被序列化 ,除此之外陣列也可以被序列化
- 不是物件裡的所有屬性都需要被寫入到檔案裡,對於不需要被寫入到檔案裡的屬性可以在宣告時加上transient關鍵字
接下來就是我們的主角了:
ObjectInputStream: 負責從檔案中讀取物件(反序列化)
ObjectOutputStream: 負責將物件寫入檔案(序列化)
構造器和常用方法自己去查API文件,我給個Demo大家看看就行:
Demo:
public classObjectDisposeStream { public static void main(String[] args) throws IOException, ClassNotFoundException { Person person = new Person("xiaoye",20); String filepath = "F:\\code\\java\\object.txt"; sera(filepath,person); Object obj = read(filepath); System.out.println(obj); } public static void sera(String filepath,Object obj) throws IOException { File file = new File(filepath); if (!file.exists()) file.createNewFile(); ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(file)); objectOutputStream.writeObject(obj); } public static Object read(String filepath) throws IOException, ClassNotFoundException { ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(filepath)); return objectInputStream.readObject(); } } class Person implements Serializable { private String name; private transient int age; //加上transient關鍵字表明在序列化時不需要將這個屬性的值寫入檔案 public Person(String name, int age) { this.name = name; this.age = age; } public Person(){} 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 + '}'; } }