java对象序列化压缩_java IO数据操作流、对象序列化、压缩流代码解析

数据操作流

在io包中,提供了两个与平台无关的数据操作流:

数据输入流(DataInputStream)

数据输出流(DataOutputStream)

通常数据输出流会按一定格式将数据输出,再通过数据输入流按照一定格式将数据读入

7adfec61a23845d4bfd9709ca43030b5.png

DataOutputStream接口定义了一系列的writeXxx()的操作,可以写入各种数据类型的数据。

范例:使用数据操作流写入与读出数据

63badcf0f88c571f7790cf6bb1461a5a.png

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 ; // 声明数据输出流对象

File f = new File("d:" + File.separator + "order.txt") ; // 文件的保存路径

dos = new DataOutputStream(new FileOutputStream(f)) ; // 实例化数据输出流对象

String names[] = {"衬衣","手套","围巾"} ; // 商品名称

float prices[] = {98.3f,30.3f,50.5f} ; // 商品价格

int nums[] = {3,2,1} ; // 商品数量

for(int i=0;i

dos.writeChars(names[i]) ; // 写入字符串

dos.writeChar('\t') ; // 写入分隔符

dos.writeFloat(prices[i]) ; // 写入价格

dos.writeChar('\t') ; // 写入分隔符

dos.writeInt(nums[i]) ; // 写入数量

dos.writeChar('\n') ; // 换行

}

dos.close() ; // 关闭输出流

}

};

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 ; // 声明数据输入流对象

File f = new File("d:" + File.separator + "order.txt") ; // 文件的保存路径

dis = new DataInputStream(new FileInputStream(f)) ; // 实例化数据输入流对象

String name = null ; // 接收名称

float price = 0.0f ; // 接收价格

int num = 0 ; // 接收数量

char temp[] = null ; // 接收商品名称

int len = 0 ; // 保存读取数据的个数

char c = 0 ; // '\u0000'

try{

while(true){

temp = new char[200] ; // 开辟空间

len = 0 ;

while((c=dis.readChar())!='\t'){ // 接收内容

temp[len] = c ;

len ++ ; // 读取长度加1

}

name = new String(temp,0,len) ; // 将字符数组变为String

price = dis.readFloat() ; // 读取价格

dis.readChar() ; // 读取\t

num = dis.readInt() ; // 读取int

dis.readChar() ; // 读取\n

System.out.printf("名称:%s;价格:%5.2f;数量:%d\n",name,price,num) ;

}

}catch(Exception e){}

dis.close() ;

}

};

对象序列化

对象序列化就是把对象变为二进制数据流的一种方法,通过对象的序列化可以方便的实现对象的传输或储存。

如果一个类想支持初始化,则该类必须实现java.io.Serilizable接口。该接口定义如下:

publicinterfaceSerilizable{}

该接口中不存在方法,因此该类属于一个标示接口,表示实现该的接口的类具备某种能力。

1.对象的序列化与反序列化

356bb4a2377c1dd5ce32e57183a5ae7e.png

2.serialVersionUID

在序列化的操作中引入了一个serialVersionUID常量,可以通过此常量来验证版本的一致性,在进行反序列化的时候,JVM会把传进来的字节流中的serialVersionUID与本地对应类的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。

import java.io.Serializable ;

public class Person implementsSerializable{

private String name ; // 声明name属性,但是此属性不被序列化

private int age ; // 声明age属性

publicPerson(String name,int age){ // 通过构造设置内容

this.name= name ;

this.age= age ;

}

publicString toString(){ // 覆写toString()方法

return"姓名:" + this.name + ";年龄:" + this.age;

}

};

3. 对象输出流:ObjectOutputStream

一个对象要想进行输出,就必须使用ObjectOutputStream类,该类定义如下

905ef48191bbd09866387796be1fe879.png

如果一个对象中的某个属性不希望被序列化的话,则可以使用transient关键字进行声明。

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 ; // 声明对象输出流

OutputStream out = newFileOutputStream(f) ; // 文件输出流

oos = new ObjectOutputStream(out) ;

oos.writeObject(new Person("张三",30)); // 保存对象

oos.close() ; // 关闭

}

};

4. 对象输入流:ObjectInputStream

c0956246c75524d88c1ef8ce544cb9f5.png

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 ; // 声明对象输入流

InputStream input = newFileInputStream(f) ; // 文件输入流

ois = new ObjectInputStream(input) ; // 实例化对象输入流

Object obj = ois.readObject() ; // 读取对象

ois.close() ; // 关闭

System.out.println(obj) ;

}

};

6.序列化一组对象

对象输出时只提供了一个对象的输出操作(writeObject(Objectobj)),并没有提供多个对象的输出,如果现在要对多个对象进行序列化的操作,则可以使用对象数组完成,由于数组是引用数据类型,所以可以直接使用Object类型进行接收。

11e9e357995cf72140f039f04ad33914.png

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

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 ; // 声明对象输出流

OutputStream out = new FileOutputStream(f); // 文件输出流

oos = new ObjectOutputStream(out) ;

oos.writeObject(obj) ; // 保存对象

oos.close() ; // 关闭

}

public static Object[] dser() throws Exception{

File f = new File("D:" +File.separator + "test.txt") ; //定义保存路径

ObjectInputStream ois = null ; // 声明对象输入流

InputStream input = newFileInputStream(f) ; // 文件输入流

ois = new ObjectInputStream(input) ; // 实例化对象输入流

Object obj[] =(Object[])ois.readObject() ; // 读取对象

ois.close() ; // 关闭

return obj ;

}

};

数组能储存的对象数量有限,因此可以使用类集进行序列化的操作。

压缩流

在Java中为了减少传输时的数据量也专门提供了压缩流,可以将文件或者文件夹压缩成ZIP、JAR、GZIP等格式。

6df3453902bd501e152ebea2b438cc15.png

该流使用较少,因此只做简要介绍。

1c80309d7564a28c712e2a3bca6dde3b.png

总结

以上就是本文关于java IO数据操作流、对象序列化、压缩流代码解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值