Java文件操作之序列化與對象處理流詳解
1.序列化與反序列化
序列化就是在保存數據時,保存數據的值和數據類型;
反序列化就是在恢復數據時,恢復數據的值和數據類型;
需要讓某個對象支持序列化機制,則必須讓其類是可序列化的;
為了讓某個類是可序列化的,該類必須實現 Serilizable與 Externalizable 兩個接口之一。
為什么需要對象處理流?
答:假設我們存儲了 int num = 20這個數據到文件中,而這個20是一個數字,我們需要從文件中將數據恢復。
可是,文件中僅僅存儲了 20 這一個數字,我們沒有辦法判斷,存儲它的時候是將它存儲為了 int 類型還是 String 類型。
而對象處理流,就是幫助我們解決類似問題的,即:能夠將 基本數據類型 或者 對象 進行序列化和反序列化操作!
2.對象處理流
2.1 概述
ObjectOutputStream 提供 序列化功能;
ObjectInputStream 提供 反序列化功能。
提供了對基本類型或者對象類型的序列化和反序列化方法。
類的繼承關系圖如下:

2.2 ObjectOutputStream案例
使用ObjectOutputStream序列化基本數據類型和一個Student對象(name,age),保存到data.dat文件中。
參考代碼與結果:
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
/**
* @author 興趣使然黃小黃
* @version 1.0
* 序列化基本數據類型和對象類型演示
*/
public class ObjectOutputStreamTest {
public static void main(String[] args) {
//創(chuàng)建流對象
ObjectOutputStream objectOutputStream = null;
try {
objectOutputStream = new ObjectOutputStream(new FileOutputStream(
"D:\\Ideaproject2021\\JavaSE\\src\\IOchapter\\data.dat"));
//序列化后,保存的文件格式,不是純文本,而是按照它自己的格式存儲的
//序列化數據
//int -> Integer(實現了 Serializable)
objectOutputStream.writeInt(100);
//boolean -> Boolean(實現了 Serializable)
objectOutputStream.writeBoolean(true);
//char -> Character
objectOutputStream.writeChar('a');
//String
objectOutputStream.writeUTF("黃小黃");
//保存一個Student對象
objectOutputStream.writeObject(new Student("黃小黃", 21));
System.out.println("數據序列化成功!");
} catch (IOException e) {
e.printStackTrace();
} finally {
//釋放資源
if(objectOutputStream != null) {
try {
objectOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
class Student implements Serializable{
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
}

說明:
序列化基本數據類型的時候,會進行自動裝箱。比如存儲int類型的100,則會以Integer的形式自動裝箱后存儲,因為Integer實現了Serializable接口。
2.3 ObjectInputStream案例
使用ObjectInputStream讀取data.dat的數據,并反序列化恢復數據。
參考代碼與結果:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
/**
* @author 興趣使然黃小黃
* @version 1.0
*/
public class ObjectInputStreamTest {
public static void main(String[] args) {
//創(chuàng)建流對象
ObjectInputStream objectInputStream = null;
try {
objectInputStream = new ObjectInputStream(new FileInputStream(
"D:\\Ideaproject2021\\JavaSE\\src\\IOchapter\\data.dat"));
//讀取數據
System.out.println(objectInputStream.readInt());
System.out.println(objectInputStream.readBoolean());
System.out.println(objectInputStream.readChar());
System.out.println(objectInputStream.readUTF());
System.out.println(objectInputStream.readObject());
//程序結束
System.out.println("反序列化完成!");
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
//釋放資源
if (objectInputStream != null){
try {
objectInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}

說明:
反序列化的順序一定要與序列化的順序一樣,否則,程序會拋出異常。
2.4 對象處理流的使用細節(jié)
1.讀寫順序一致,即序列化與反序列化的順序應該一致;
2.要求實現序列化或者反序列化對象,需要實現Serializable接口;
3.序列化類中建議添加SerialVersionUID,為了提高版本兼容性;
4.序列化對象時,默認將里面所有的屬性都進行序列化,但static與transient修飾的成員除外;
5.序列化對象時,要求里面的屬性的類型也要實現序列化接口;
6.序列化具備可繼承性,也就是如果某類已經實現了序列化,則它的所有子類也已經默認實現了序列化。
到此這篇關于Java文件操作之序列化與對象處理流詳解的文章就介紹到這了,更多相關Java序列化 對象處理流內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
java發(fā)送post請求使用multipart/form-data格式文件數據到接口代碼示例
這篇文章主要介紹了java發(fā)送post請求使用multipart/form-data格式文件數據到接口的相關資料,文中指定了數據編碼格式為UTF-8,并強調了所需依賴工具類,需要的朋友可以參考下2024-12-12
解決springboot responseentity<string>亂碼問題
這篇文章主要介紹了解決springboot responseentity<string>亂碼問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
springboot整合RabbitMQ發(fā)送短信的實現
本文會和SpringBoot做整合,實現RabbitMQ發(fā)送短信,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-05-05
.properties文件讀取及占位符${...}替換源碼解析
本篇文章主要介紹了.properties文件讀取及占位符${...}替換源碼解析的相關知識,具有很好的參考價值。下面跟著小編一起來看下吧2017-05-05

