1. 程式人生 > 其它 >|NO.Z.00085|——————————|BigDataEnd|——|Java&IO流.V12|--------------------------------------------------|Java.v12|IO流.v12|ObjectOutputStream類|概念使用|

|NO.Z.00085|——————————|BigDataEnd|——|Java&IO流.V12|--------------------------------------------------|Java.v12|IO流.v12|ObjectOutputStream類|概念使用|



[BigDataJava:Java&IO流.V12]                                                                                    [BigDataJava.核心類庫] [|章節二|IO流|ObjectOutputStream類的概念和使用|]








一、ObjectOutputStream類(重點)
### --- 基本概念

——>        java.io.ObjectOutputStream類主要用於將一個物件的所有內容整體寫入到輸出流中。
——>        只能將支援 java.io.Serializable 介面的物件寫入流中。
——>        類通過實現 java.io.Serializable 介面以啟用其序列化功能。
——>        所謂序列化主要指將一個物件需要儲存的相關資訊有效組織成位元組序列的轉化過程。
二、常用的方法
方法宣告 功能介紹
ObjectOutputStream(OutputStream out) 根據引數指定的引用來構造物件
void writeObject(Object obj) 用於將引數指定的物件整體寫入到輸出流中
void close() 用於關閉輸出流並釋放有關的資源
三、ObjectInputStream類(重點)
### --- 基本概念

——>        java.io.ObjectInputStream類主要用於從輸入流中一次性將物件整體讀取出來。
——>        所謂反序列化主要指將有效組織的位元組序列恢復為一個物件及相關資訊的轉化過程。
四、常用的
方法宣告 功能介紹
ObjectInputStream(InputStreamin) 根據引數指定的引用來構造物件
Object readObject() 主要用於從輸入流中讀取一個物件並返回 無法通過返回值來判斷是否讀取到檔案的末尾
void close() 用於關閉輸入流並釋放有關的資源
### --- 序列化版本號

——>        序列化機制是通過在執行時判斷類的serialVersionUID來驗證版本一致性的。
——>        在進行反序列化時,JVM會把傳來的位元組流中的serialVersionUID與本地相應
——>        實體類的serialVersionUID進行比較,如果相同就認為是一致的,
——>        可以進行反序列化,否則就會出現序列化版本不一致的異常(InvalidCastException)。
### --- transient關鍵字

——>        transient是Java語言的關鍵字,用來表示一個域不是該物件序列化的一部分。
——>        當一個物件被序列化的時候,transient型變數的值不包括在序列化的表示中,
——>        然而非transient型的變數是被包括進去的。
### --- 經驗的分享

——>        當希望將多個物件寫入檔案時,通常建議將多個物件放入一個集合中,
——>        然後將集合這個整體看做一個物件寫入輸出流中,
——>        此時只需要呼叫一次readObject方法就可以將整個集合的資料讀取出來,
——>        從而避免了通過返回值進行是否達到檔案末尾的判斷。
五、程式設計程式碼
package com.yanqi.task17;

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 + '\'' +
                '}';
    }
}
六、程式設計程式碼
package com.yanqi.task17;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class ObjectInputStreamTest {

    public static void main(String[] args) {
        ObjectInputStream ois = null;

        try {
            // 1.建立ObjectInputStream型別的物件與d:/a.txt檔案關聯
            ois = new ObjectInputStream(new FileInputStream("d:/a.txt"));
            // 2.從輸入流中讀取一個物件並列印
            Object obj = ois.readObject();
            System.out.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();
                }
            }
        }
    }
}
七、程式設計程式碼
package com.yanqi.task17;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class ObjectOutputStreamTest {

    public static void main(String[] args) {
        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);
            System.out.println("寫入物件成功!");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 4.關閉流物件並釋放有關的資源
            if (null != oos) {
                try {
                    oos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
八、編譯列印
D:\JAVA\jdk-11.0.2\bin\java.exe "-javaagent:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=64783:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath E:\NO.Z.10000——javaproject\NO.H.00001.javase\javase\out\production\javase com.yanqi.task17.ObjectOutputStreamTest
寫入物件成功!

Process finished with exit code 0
D:\JAVA\jdk-11.0.2\bin\java.exe "-javaagent:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=64789:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath E:\NO.Z.10000——javaproject\NO.H.00001.javase\javase\out\production\javase com.yanqi.task17.ObjectInputStreamTest
讀取到的物件是:User{userName='qidian', password='123456', phoneNum='null'}

Process finished with exit code 0








===============================END===============================


Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart                                                                                                                                                    ——W.S.Landor



來自為知筆記(Wiz)