JavaSE: ObjectOutputStream 類 和 ObjectInputStream 類

ObjectOutputStream 類java

  <1>  基本概念ide

        1.  java.io.ObjectOutputStream類:用於將一個對象的全部內容總體寫入到輸出流中this

        2.  只能將支持 java.io.Serializable 接口的對象寫入流中spa

        3.  類經過實現 java.io.Serializable 接口以啓用其序列化功能對象

        4.  所謂序列化,指將一個對象須要儲存的相關信息,有效組織成字節序列的轉化過程接口

  <2>  經常使用的方法資源

        方法聲明                          功能介紹get

        ObjectOutputStream(OutputStream out)             根據參數指定的引用來構造對象it

        void writeObject(Object obj)                   用於將參數指定的對象總體,寫入到輸出流中io

        void close()                         用於關閉輸出流,並釋放有關的資源

  <3>  代碼示例

      class ObjectOutputStreamTest {

        main(){

          ObjectOutputStream oos = null;

          try{

            //  1.  建立ObjectOutputStream類型的對象,與d:/a.txt文件關聯

            oos = new ObjectOutputStream (new FileOutputStream("d:/a.txt"));

            //  2.  準備一個User類型的對象,並初始化

            User user = new User("qidian", "123456", "13511258688");

            //  3.  將整個User類型的對象寫入輸出流

            oos.writeObject(user);

            println("寫入對象成功!");

          }catch (IOException e) {

            e.printStackTrace();
          } finally {
            // 4.關閉流對象並釋放有關的資源
            if (null != oos) {
              try {
                oos.close();
              } catch (IOException e) {
                e.printStackTrace();
              }
            }
          }

        }

      }

// User.java
public class User implements java.io.Serializable {
    private static final long serialVersionUID = -5814716593800822421L;

    private String userName;  // 用戶名
    private String password;  // 密碼
    private transient String phoneNum;  // 手機號  表示該成員變量不參與序列化操做

    public User() {
    }

    public User(String userName, String password, String phoneNum) {
        this.userName = userName;
        this.password = password;
        this.phoneNum = phoneNum;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getPhoneNum() {
        return phoneNum;
    }

    public void setPhoneNum(String phoneNum) {
        this.phoneNum = phoneNum;
    }

    @Override
    public String toString() {
        return "User{" +
                "userName='" + userName + '\'' +
                ", password='" + password + '\'' +
                ", phoneNum='" + phoneNum + '\'' +
                '}';
    }
}

 

 

ObjectInputStream 類

  <1>  基本概念

        java.io.ObjectInputStream類:用於從輸入流中,一次性將對象總體讀取出來。

        所謂反序列化,指將有效組織的字節序列,恢復爲一個對象,及相關信息的轉化過程

  <2>  經常使用的方法

        方法聲明                          功能介紹

        ObjectInputStream(InputStream in)                根據參數指定的引用來構造對象

        Object readObject()                      從輸入流中,讀取一個對象,並返回,沒法經過返回值來判斷是否讀取到文件的末尾

        void close()                           用於關閉輸入流,並釋放有關的資源

  <3>  版本化序列號

        序列化機制,是經過在運行時判斷類的 serialVersionUID 來驗證版本一致性的。 在進行反序列化時,JVM會把傳來的字節流中的 serialVersionUID 與

        本地相應實體類的 serialVersionUID 進行比較,若是相同就認爲是一致的,能夠進行反序列化,不然就會出現序列化版本不一致的異常

        (InvalidCastException)。

  <4>  transient 關鍵字

        transient 是Java語言的關鍵字,用來表示一個域不是該對象串行化的一部分。

        當一個對象被串行化的時候,transient 型變量的值不包括在串行化的表示中,然而非 transient 型的變量是被包括進去的。

  <5>  經驗

        當但願將多個對象寫入文件時,一般將多個對象放入一個集合中,而後將集合這個總體,看做一個對象,寫入輸出流中,

        此時只須要調用一次 readObject方法,就能夠將整個集合的數據讀取出來,從而避免了經過返回值,進行是否到達文件末尾的判斷。

   <6>  代碼示例

      class ObjectInputStreamTest {

        main(){

          ObjectInputStream ois = null;

          try{

            // 1. 建立ObjectInputStream類型的對象,與d:/a.txt文件關聯

            ois = new ObjectInputStream(new FileInputStream("d:/a.txt"));

            // 2. 從輸入流中,讀取一個對象,並打印

            Object obj = ois.readObject();

            println("讀取到的對象是:"  + obj);  // qidian 123456 13511258688  null

          }catch (IOException e) {

            e.printStackTrace();
          } catch (ClassNotFoundException e) {
            e.printStackTrace();
          } finally {
            // 3.關閉流對象並釋放有關的資源
            if (null != ois) {
              try {
                ois.close();
              } catch (IOException e) {
                e.printStackTrace();
              }
            }
          }

        }

      }

相關文章
相關標籤/搜索