java IO數(shù)據(jù)操作流、對(duì)象序列化、壓縮流代碼解析
數(shù)據(jù)操作流
在io包中,提供了兩個(gè)與平臺(tái)無關(guān)的數(shù)據(jù)操作流:
數(shù)據(jù)輸入流(DataInputStream)
數(shù)據(jù)輸出流(DataOutputStream)
通常數(shù)據(jù)輸出流會(huì)按一定格式將數(shù)據(jù)輸出,再通過數(shù)據(jù)輸入流按照一定格式將數(shù)據(jù)讀入

DataOutputStream接口定義了一系列的writeXxx()的操作,可以寫入各種數(shù)據(jù)類型的數(shù)據(jù)。
范例:使用數(shù)據(jù)操作流寫入與讀出數(shù)據(jù)

import java.io.DataOutputStream ;
import java.io.File ;
import java.io.FileOutputStream ;
public class DataOutputStreamDemo{
public static void main(String args[]) throws Exception{ // 所有異常拋出
DataOutputStream dos = null ; // 聲明數(shù)據(jù)輸出流對(duì)象
File f = new File("d:" + File.separator + "order.txt") ; // 文件的保存路徑
dos = new DataOutputStream(new FileOutputStream(f)) ; // 實(shí)例化數(shù)據(jù)輸出流對(duì)象
String names[] = {"襯衣","手套","圍巾"} ; // 商品名稱
float prices[] = {98.3f,30.3f,50.5f} ; // 商品價(jià)格
int nums[] = {3,2,1} ; // 商品數(shù)量
for(int i=0;i<names.length;i++){ // 循環(huán)輸出
dos.writeChars(names[i]) ; // 寫入字符串
dos.writeChar('\t') ; // 寫入分隔符
dos.writeFloat(prices[i]) ; // 寫入價(jià)格
dos.writeChar('\t') ; // 寫入分隔符
dos.writeInt(nums[i]) ; // 寫入數(shù)量
dos.writeChar('\n') ; // 換行
}
dos.close() ; // 關(guān)閉輸出流
}
};
import java.io.DataInputStream ;
import java.io.File ;
import java.io.FileInputStream ;
public class DataInputStreamDemo{
public static void main(String args[]) throws Exception{ // 所有異常拋出
DataInputStream dis = null ; // 聲明數(shù)據(jù)輸入流對(duì)象
File f = new File("d:" + File.separator + "order.txt") ; // 文件的保存路徑
dis = new DataInputStream(new FileInputStream(f)) ; // 實(shí)例化數(shù)據(jù)輸入流對(duì)象
String name = null ; // 接收名稱
float price = 0.0f ; // 接收價(jià)格
int num = 0 ; // 接收數(shù)量
char temp[] = null ; // 接收商品名稱
int len = 0 ; // 保存讀取數(shù)據(jù)的個(gè)數(shù)
char c = 0 ; // '\u0000'
try{
while(true){
temp = new char[200] ; // 開辟空間
len = 0 ;
while((c=dis.readChar())!='\t'){ // 接收內(nèi)容
temp[len] = c ;
len ++ ; // 讀取長度加1
}
name = new String(temp,0,len) ; // 將字符數(shù)組變?yōu)镾tring
price = dis.readFloat() ; // 讀取價(jià)格
dis.readChar() ; // 讀取\t
num = dis.readInt() ; // 讀取int
dis.readChar() ; // 讀取\n
System.out.printf("名稱:%s;價(jià)格:%5.2f;數(shù)量:%d\n",name,price,num) ;
}
}catch(Exception e){}
dis.close() ;
}
};
對(duì)象序列化
對(duì)象序列化就是把對(duì)象變?yōu)槎M(jìn)制數(shù)據(jù)流的一種方法,通過對(duì)象的序列化可以方便的實(shí)現(xiàn)對(duì)象的傳輸或儲(chǔ)存。
如果一個(gè)類想支持初始化,則該類必須實(shí)現(xiàn)java.io.Serilizable接口。該接口定義如下:
publicinterfaceSerilizable{}
該接口中不存在方法,因此該類屬于一個(gè)標(biāo)示接口,表示實(shí)現(xiàn)該的接口的類具備某種能力。
1.對(duì)象的序列化與反序列化

2.serialVersionUID
在序列化的操作中引入了一個(gè)serialVersionUID常量,可以通過此常量來驗(yàn)證版本的一致性,在進(jìn)行反序列化的時(shí)候,JVM會(huì)把傳進(jìn)來的字節(jié)流中的serialVersionUID與本地對(duì)應(yīng)類的serialVersionUID進(jìn)行比較,如果相同就認(rèn)為是一致的,可以進(jìn)行反序列化,否則就會(huì)出現(xiàn)序列化版本不一致的異常。
import java.io.Serializable ;
public class Person implementsSerializable{
private String name ; // 聲明name屬性,但是此屬性不被序列化
private int age ; // 聲明age屬性
publicPerson(String name,int age){ // 通過構(gòu)造設(shè)置內(nèi)容
this.name= name ;
this.age= age ;
}
publicString toString(){ // 覆寫toString()方法
return"姓名:" + this.name + ";年齡:" + this.age;
}
};
3. 對(duì)象輸出流:ObjectOutputStream
一個(gè)對(duì)象要想進(jìn)行輸出,就必須使用ObjectOutputStream類,該類定義如下

如果一個(gè)對(duì)象中的某個(gè)屬性不希望被序列化的話,則可以使用transient關(guān)鍵字進(jìn)行聲明。
importjava.io.File ;
importjava.io.FileOutputStream ;
importjava.io.OutputStream ;
importjava.io.ObjectOutputStream ;
publicclass SerDemo01{
public static void main(String args[]) throwsException {
File f = new File("D:" +File.separator + "test.txt") ; //定義保存路徑
ObjectOutputStream oos = null ; // 聲明對(duì)象輸出流
OutputStream out = newFileOutputStream(f) ; // 文件輸出流
oos = new ObjectOutputStream(out) ;
oos.writeObject(new Person("張三",30)); // 保存對(duì)象
oos.close() ; // 關(guān)閉
}
};
4. 對(duì)象輸入流:ObjectInputStream

importjava.io.File ;
importjava.io.FileInputStream ;
importjava.io.InputStream ;
importjava.io.ObjectInputStream ;
publicclass SerDemo02{
public static void main(String args[]) throwsException {
File f = new File("D:" +File.separator + "test.txt") ; //定義保存路徑
ObjectInputStream ois = null ; // 聲明對(duì)象輸入流
InputStream input = newFileInputStream(f) ; // 文件輸入流
ois = new ObjectInputStream(input) ; // 實(shí)例化對(duì)象輸入流
Object obj = ois.readObject() ; // 讀取對(duì)象
ois.close() ; // 關(guān)閉
System.out.println(obj) ;
}
};
6.序列化一組對(duì)象
對(duì)象輸出時(shí)只提供了一個(gè)對(duì)象的輸出操作(writeObject(Objectobj)),并沒有提供多個(gè)對(duì)象的輸出,如果現(xiàn)在要對(duì)多個(gè)對(duì)象進(jìn)行序列化的操作,則可以使用對(duì)象數(shù)組完成,由于數(shù)組是引用數(shù)據(jù)類型,所以可以直接使用Object類型進(jìn)行接收。

importjava.io.File ;
importjava.io.IOException ;
importjava.io.FileOutputStream ;
importjava.io.OutputStream ;
importjava.io.ObjectOutputStream ;
importjava.io.FileInputStream ;
importjava.io.InputStream ;
importjava.io.ObjectInputStream ;
publicclass SerDemo05{
public static void main(String args[]) throwsException{
Person per[] = {new Person("張三",30),newPerson("李四",31),
new Person("王五",32)};
ser(per) ;
Object o[] = (Object[])dser() ;
for(int i=0;i<o.length;i++){
Person p = (Person)o[i] ;
System.out.println(p) ;
}
}
public static void ser(Object obj[]) throwsException {
File f = new File("D:" +File.separator + "test.txt") ; //定義保存路徑
ObjectOutputStream oos = null ; // 聲明對(duì)象輸出流
OutputStream out = new FileOutputStream(f); // 文件輸出流
oos = new ObjectOutputStream(out) ;
oos.writeObject(obj) ; // 保存對(duì)象
oos.close() ; // 關(guān)閉
}
public static Object[] dser() throws Exception{
File f = new File("D:" +File.separator + "test.txt") ; //定義保存路徑
ObjectInputStream ois = null ; // 聲明對(duì)象輸入流
InputStream input = newFileInputStream(f) ; // 文件輸入流
ois = new ObjectInputStream(input) ; // 實(shí)例化對(duì)象輸入流
Object obj[] =(Object[])ois.readObject() ; // 讀取對(duì)象
ois.close() ; // 關(guān)閉
return obj ;
}
};
數(shù)組能儲(chǔ)存的對(duì)象數(shù)量有限,因此可以使用類集進(jìn)行序列化的操作。
壓縮流
在Java中為了減少傳輸時(shí)的數(shù)據(jù)量也專門提供了壓縮流,可以將文件或者文件夾壓縮成ZIP、JAR、GZIP等格式。

該流使用較少,因此只做簡(jiǎn)要介紹。

總結(jié)
以上就是本文關(guān)于java IO數(shù)據(jù)操作流、對(duì)象序列化、壓縮流代碼解析的全部內(nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
相關(guān)文章
詳解Java使用Jsch與sftp服務(wù)器實(shí)現(xiàn)ssh免密登錄
這篇文章主要介紹了詳解Java使用Jsch與sftp服務(wù)器實(shí)現(xiàn)ssh免密登錄,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
Java方法重寫_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
在Java和其他一些高級(jí)面向?qū)ο蟮木幊陶Z言中,子類可繼承父類中的方法,而不需要重新編寫相同的方法。但有時(shí)子類并不想原封不動(dòng)地繼承父類的方法,而是想作一定的修改,這就需要采用方法的重寫。方法重寫又稱方法覆蓋,下文給大家介紹java方法重寫及重寫規(guī)則,一起學(xué)習(xí)吧2017-04-04
Java生成隨機(jī)姓名、性別和年齡的實(shí)現(xiàn)示例
這篇文章主要介紹了Java生成隨機(jī)姓名、性別和年齡的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
深入理解spring boot異步調(diào)用方式@Async
Spring為任務(wù)調(diào)度與異步方法執(zhí)行提供了注解支持。通過在方法上設(shè)置@Async注解,可使得方法被異步調(diào)用。下面這篇文章主要給大家介紹了關(guān)于spring boot異步調(diào)用方式@Async的相關(guān)資料,需要的朋友可以參考下。2017-07-07
Java中Spring技巧之?dāng)U展點(diǎn)的應(yīng)用
這篇文章主要介紹了Java中Spring技巧之?dāng)U展點(diǎn)的應(yīng)用,下文Spring容器的啟動(dòng)流程圖展開其內(nèi)容的相關(guān)資料,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-04-04

