1. 程式人生 > 其它 >JavaIO流之物件流

JavaIO流之物件流

IO流中的物件流

  1. ObjectInputStream 和 ObjectOutputStream
  2. 作用:用於儲存和讀取基本資料型別資料或物件的處理流。它的強大之處就是可以把Java中的物件寫入到資料來源中,也能把物件從資料來源中還原回來。
  3. 要想一個java物件是可序列化的,需要滿足相應的要求。
    XX類需要滿足如下的要求,方可序列化
  • 需要實現介面:Serializable (是一個標識介面,其中沒有抽象方法)
  • 當前類提供一個全域性常量:serialVersionUID
  • 除了當前Person類需要實現Serializable介面之外,還必須保證其內部所有屬性也必須是可序列化的。(預設情況下,基本資料型別可序列化)
  • 補充:ObjectOutputStream和ObjectInputStream不能序列化static和transient修飾的成員變數
  1. 序列化機制:
  • 物件序列化機制允許把記憶體中的Java物件轉換成平臺無關的二進位制流,從而允許把這種
  • 二進位制流持久地儲存在磁碟上,或通過網路將這種二進位制流傳輸到另一個網路節點。
  • 當其它程式獲取了這種二進位制流,就可以恢復成原來的Java物件

序列化過程

將記憶體中的java物件儲存到磁碟中或通過網路傳輸出去。
使用ObjectOutputStream實現
測試程式碼:

    @Test
    public void testObjectOS(){
        ObjectOutputStream oos = null;
        try {
            //1.造流
            oos = new ObjectOutputStream(new FileOutputStream("object.dat"));
            //2.將物件寫入檔案
            oos.writeObject(new String("唯獨你沒懂"));
            oos.flush();
            oos.writeObject(new Person("zyj",23));
            oos.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //3.
            if (oos != null) {
                try {
                    oos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

反序列化

將磁碟檔案中的物件還原為記憶體中的一個java物件。
使用ObjectInputStream來實現
測試程式碼:

    @Test
    public void testObjectIS(){
        ObjectInputStream ois = null;
        try {
            ois = new ObjectInputStream(new FileInputStream("object.dat"));
            Object o = ois.readObject();
            String str = (String) o;
            Person p = (Person) ois.readObject();
            System.out.println(str);
            System.out.println(p);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (ois != null) {
                try {
                    ois.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

上述測試中所使用到的Person類:

public class Person implements Serializable {
    public static final long serialVersionUID = 4148615616546546512L;
    private String name;
    private int age;

    public Person() {
    }
    public Person(String name, int age) {
        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 +
                '}';
    }
}