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

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

說(shuō)明:
序列化基本數(shù)據(jù)類型的時(shí)候,會(huì)進(jìn)行自動(dòng)裝箱。比如存儲(chǔ)int類型的100,則會(huì)以Integer的形式自動(dòng)裝箱后存儲(chǔ),因?yàn)镮nteger實(shí)現(xiàn)了Serializable接口。
2.3 ObjectInputStream案例
使用ObjectInputStream讀取data.dat的數(shù)據(jù),并反序列化恢復(fù)數(shù)據(jù)。
參考代碼與結(jié)果:
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)建流對(duì)象
ObjectInputStream objectInputStream = null;
try {
objectInputStream = new ObjectInputStream(new FileInputStream(
"D:\\Ideaproject2021\\JavaSE\\src\\IOchapter\\data.dat"));
//讀取數(shù)據(jù)
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());
//程序結(jié)束
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();
}
}
}
}
}

說(shuō)明:
反序列化的順序一定要與序列化的順序一樣,否則,程序會(huì)拋出異常。
2.4 對(duì)象處理流的使用細(xì)節(jié)
1.讀寫順序一致,即序列化與反序列化的順序應(yīng)該一致;
2.要求實(shí)現(xiàn)序列化或者反序列化對(duì)象,需要實(shí)現(xiàn)Serializable接口;
3.序列化類中建議添加SerialVersionUID,為了提高版本兼容性;
4.序列化對(duì)象時(shí),默認(rèn)將里面所有的屬性都進(jìn)行序列化,但static與transient修飾的成員除外;
5.序列化對(duì)象時(shí),要求里面的屬性的類型也要實(shí)現(xiàn)序列化接口;
6.序列化具備可繼承性,也就是如果某類已經(jīng)實(shí)現(xiàn)了序列化,則它的所有子類也已經(jīng)默認(rèn)實(shí)現(xiàn)了序列化。
到此這篇關(guān)于Java文件操作之序列化與對(duì)象處理流詳解的文章就介紹到這了,更多相關(guān)Java序列化 對(duì)象處理流內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java發(fā)送post請(qǐng)求使用multipart/form-data格式文件數(shù)據(jù)到接口代碼示例
這篇文章主要介紹了java發(fā)送post請(qǐng)求使用multipart/form-data格式文件數(shù)據(jù)到接口的相關(guān)資料,文中指定了數(shù)據(jù)編碼格式為UTF-8,并強(qiáng)調(diào)了所需依賴工具類,需要的朋友可以參考下2024-12-12
Java實(shí)現(xiàn)獲取內(nèi)網(wǎng)的所有IP地址
這篇文章主要介紹了如何利用Java語(yǔ)言實(shí)現(xiàn)獲取內(nèi)網(wǎng)的所有IP地址,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)有一定的參考價(jià)值,快跟隨小編一起學(xué)習(xí)一下吧2022-06-06
Idea自動(dòng)生成Entity實(shí)現(xiàn)過程詳解
這篇文章主要介紹了Idea自動(dòng)生成Entity實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
解決springboot responseentity<string>亂碼問題
這篇文章主要介紹了解決springboot responseentity<string>亂碼問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
springboot整合RabbitMQ發(fā)送短信的實(shí)現(xiàn)
本文會(huì)和SpringBoot做整合,實(shí)現(xiàn)RabbitMQ發(fā)送短信,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
.properties文件讀取及占位符${...}替換源碼解析
本篇文章主要介紹了.properties文件讀取及占位符${...}替換源碼解析的相關(guān)知識(shí),具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-05-05
微信java開發(fā)之實(shí)現(xiàn)微信主動(dòng)推送消息
這篇文章主要介紹了微信開發(fā)過程中的使用java實(shí)現(xiàn)微信主動(dòng)推送消息示例,需要的朋友可以參考下2014-03-03
Java+JFrame實(shí)現(xiàn)貪吃蛇小游戲
這篇文章主要為大家詳細(xì)介紹了Java+JFrame實(shí)現(xiàn)貪吃蛇小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06

