ObjectInputStream及其相關知識

一、對象的序列化和反序列化

1、對象的序列化和反序列化

/** * 將對象序列化到文件中 * * @param obj 對象 * @param file 文件 * @throws IOException IO異常 */public static void writeObjectToFile(Object obj, File file) throws IOException {    try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file))) {        oos.writeObject(obj);    }}/** * 從文件中反序列化得到對象 * * @param file 文件 * @param   對象類型 * @return 反序列化得到的對象 * @throws IOException            IO異常 * @throws ClassNotFoundException 找不到類異常 */public static  T readObjectFromFile(File file) throws IOException, ClassNotFoundException {    try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file))) {        return (T) ois.readObject();    }}

2、對象的序列化和反序列化例子

public class SerializeObject {    public static void main(String[] args) throws IOException, ClassNotFoundException {        File file = new File("object.txt");        Student studentSrc = new Student("Tom", 18);        writeObjectToFile(studentSrc, file);        Student studentDst = readObjectFromFile(file);        System.out.println("studentDst = " + studentDst);    }}class Student implements Serializable {    private String name;    private int age;    public Student(String name, int age) {        this.name = name;        this.age = age;    }    @Override    public String toString() {        return "Student{" +                "name='" + name + '\'' +                ", age=" + age +                '}';    }}

二、ObjectInputStream類的詳解

1、ObjectInputStream類簡介

public class ObjectInputStream extends InputStream implements ObjectInput, ObjectStreamConstants {    protected ObjectInputStream() throws IOException, SecurityException {}    public ObjectInputStream(InputStream in) throws IOException {        verifySubclass();        bin = new BlockDataInputStream(in);        handles = new HandleTable(10);        vlist = new ValidationList();    }    private final BlockDataInput bin;    // more code omitted}

2、ObjectInputStream類的方法

/** *從流中讀取一個Object對象 * * @throws IOException            IO異常 * @throws ClassNotFoundException 找不到類異常 */public final Object readObject() throws IOException, ClassNotFoundException { /* more code */ }/** * 從流中讀取一個boolean類型的值 * * @throws IOException IO異常 */public boolean readBoolean() throws IOException { /* more code */ } 

三、ObjectOutputStream類及其相關類的詳解

1、ObjectOutputStream類簡介

public class ObjectOutputStream extends OutputStream implements ObjectOutput, ObjectStreamConstants {    /** 寫入對象 */    public void writeObject(Object obj) throws IOException {...}    /** 獲取包含此流中的所有對象曾經的引用 */    protected ObjectStreamClass getObjectStreamClass(Class cl) throws IOException, ClassNotFoundException {...}    /** 寫入單個字節 */    public void write(int val) throws IOException {...}    /** 實現數據寫入底層的操作系統 */    public void flush() throws IOException {...}    /** 關閉對象輸出流 */    public void close() throws IOException {...}}final class BlockDataOutputStream {...}final class BlockDataInputStream {...}

2、ObjectOutputStream類的方法

/** * 將指定的基本類型寫入流中。 */public final void writeInt(int val) throws IOException { /* more code */ }/** * 將單個double精度浮點數寫入流中 */public final void writeDouble(double val) throws IOException { /* more code */ }/** * 寫入一個UTF-8編碼格式的字符串 */public final void writeUTF(String str) throws IOException { /* more code */ }

四、常用工具類的使用

1、IOUtils類

/** * 將InputStream轉為byte[] * * @param inputStream 輸入流 * @return byte[] * @throws IOException IO異常 */public static byte[] toByteArray(InputStream inputStream) throws IOException {    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();    byte[] buffer = new byte[1024 * 4];    int n;    while (-1 != (n = inputStream.read(buffer))) {        byteArrayOutputStream.write(buffer, 0, n);    }    return byteArrayOutputStream.toByteArray();}

2、ByteArrayUtils類

/** * 將序列化字節數組轉為指定類型的對象 * * @param bytes 序列化字節數組 * @param clazz 指定類型 * @param    類型 * @return 對象 * @throws IOException            IO異常 * @throws ClassNotFoundException 找不到類異常 */public static  T deserialize(byte[] bytes, Class clazz) throws IOException, ClassNotFoundException {    try (ByteArrayInputStream bis = new ByteArrayInputStream(bytes);         ObjectInputStream ois = new ObjectInputStream(bis)) {        return (T) ois.readObject();    }}/** * 將對象序列化為字節數組 * * @param obj 對象 * @return 序列化字節數組 * @throws IOException IO異常 */public static byte[] serialize(Object obj) throws IOException {    try (ByteArrayOutputStream bos = new ByteArrayOutputStream();         ObjectOutputStream oos = new ObjectOutputStream(bos)) {        oos.writeObject(obj);        return bos.toByteArray();    }}

五、總結

本文主要介紹了對象的序列化和反序列化知識及其相關類,同時也介紹了常用工具類的使用。通過學習,我們了解了對象的序列化和反序列化的原理和方法,了解了ObjectInputStream、ObjectOutputStream、BlockDataOutputStream、BlockDataInputStream等相關類的詳細信息,以及IOUtils和ByteArrayUtils這兩個常用的工具類的使用方法。希望對你的學習和工作有所幫助。

原創文章,作者:QXTZU,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/332014.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
QXTZU的頭像QXTZU
上一篇 2025-01-20 14:11
下一篇 2025-01-20 14:11

相關推薦

  • Fuzzer:什麼是Fuzzer及其相關知識

    一、Fuzzer是什麼 Fuzzer是一種用於發現軟件漏洞的自動化安全測試工具。它能夠以隨機的方式輸入數據、命令或文件,發現一些未被預期的錯誤或漏洞,這些錯誤或漏洞可以造成拒絕服務…

    編程 2025-04-23
  • tarxf命令-文件打包、壓縮、解壓縮工具的使用方法及相關知識

    一、泰安日系髮型 點擊進入泰安日系髮型店鋪評價頁面,發現該店是泰安市區較受歡迎的男士理髮店之一,提供了燙髮、染髮、剪髮、理髮等服務。其關注度,與tarxf命令有什麼聯繫?實際上,t…

    編程 2025-04-12
  • BigDecimal初始化為0的相關知識

    一、BigDecimal-概述 BigDecimal是Java中的一個類,用於表示高精度的十進制數,提供高精度計算能力。它可以表示任意長度和精度的浮點數值,是一種更為精確的表示和計…

    編程 2025-02-24
  • Linux中修改系統時間及相關知識詳解

    一、系統時間的意義 系統時間是指在Linux系統中記錄的時間,用於文件的創建、修改、訪問時間,日誌記錄等等。在一個社交媒體網站,每一個新發的帖子或圖片,都會記錄它的創建時間,方便其…

    編程 2025-02-05
  • Qt中延時相關知識詳解

    一、延時的原理 在Qt中,延時指的是程序暫停一段時間後再繼續執行。了解延時的原理可以更方便地使用延時相關函數。 Qt中延時的實現涉及到操作系統,因為延時需要用到操作系統提供的定時器…

    編程 2025-01-21
  • 深入了解Oracle時間相關知識

    一、Oracle時間介紹 Oracle數據庫是一種關係型數據庫管理系統,時間在其中扮演了至關重要的角色。Oracle數據庫的時間記錄使用內部時間格式存儲,以便在表達式中進行比較和計…

    編程 2025-01-21
  • 深入解析quantile函數的相關知識

    一、quantile函數 量化函數(quantile function)是一個統計學上的概念,允許我們從一個已知的概率分布中計算出一個給定的概率值的對應值。 R 語言中提供了很多不…

    編程 2025-01-20
  • 淺談pcilan的相關知識

    一、pci藍牙 PCI藍牙是一種無線通信技術,其通過計算機的PCI接口實現了高速連接藍牙設備的功能。 對於使用PC機的用戶們來說,可以通過PC機內置的PCI藍牙接口來無線連接各種藍…

    編程 2025-01-14
  • c語言文件常見,c語言文件相關知識

    本文目錄一覽: 1、c語言中有哪些常用的頭文件? 2、在C語言中:常見的文件打開方式及含義 3、C語言的文件類型有哪些? 4、c語言中文件類型有幾種? c語言中有哪些常用的頭文件?…

    編程 2024-12-28
  • mysqladddate函數的使用及其相關知識

    一、 mysqladddate函數的概述 MySQL是一個開源、關係型數據庫管理系統,是LAMP(Linux、Apache、MySQL、PHP/Perl/Python)或LEMP(…

    編程 2024-12-28

發表回復

登錄後才能評論