Java将不同类的对象序列化到同一个文件中,并利用文件指针反序列化

 昨天学习了序列化和反序列化,突发奇想,实现了这个功能,看代码可以发现,我只是简单的实现了这个
功能,细节的东西并没有多做处理,seek指针和长度都是手动填入的,而且这个功能实际中也没什么用,

仅供大家交流参考。

类Serializable:

package p0119.serializable.diffclass;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class Serializable {
	//文件输出流
	static FileOutputStream fos = null;
	//对象输出流
	static ObjectOutputStream oos=null;
	//字节输出流
	static ByteArrayOutputStream bo=null;
	//File对象
	static File file = new File("b.bin");
	
	public static void main(String[] args) {
		try {
			//true为写入文件时追加而不是覆盖
			fos=new FileOutputStream(file,true);
			//用字节数组输出流的目的是,对象序列化到流中后,可以使用这个流的toByteArray方法
			bo=new ByteArrayOutputStream();
			oos=new ObjectOutputStream(bo);
			
//			Man m = new Man("tom", 12);
			Animal a = new Animal("dog", "man");
			//序列化对象
			oos.writeObject(a);
			//数据有多长数组就多大,不会产生多余占用空间
			byte[] buff = bo.toByteArray();
			
			//len为序列化后的长度
			int len=buff.length;
			//写入文件之前的文件长度,用于反序列化时的seek
			long beforLength = file.length();
			System.out.println("Seek:"+beforLength);
			System.out.println("Length:"+len);
			
			//将存有序列化后的对象的byte数组写入文件
			fos.write(buff);
			fos.flush();
			oos.close();
			fos.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}	

类DeSerializable:

package p0119.serializable.diffclass;

import java.io.ByteArrayInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.RandomAccessFile;

public class DeSerializable {
	public static void main(String[] args) {
		try {
			//随机文件访问类,可以用seek设置指针,从指定位置读取数据
			RandomAccessFile ris = new RandomAccessFile("b.bin", "r");
			//此处手动填入一个指针
			ris.seek(194);
			//手动设置长度
			int len =107;
			//以len长度创建一个byte数组用与存储从文件读取的信息
			byte[] buff = new byte[len];
			//读取数据到buff数组
			ris.read(buff, 0, len);
			
			//由于读取出来的byte数组不能直接用于反序列化,所以此处用了字节数组输入类
			ByteArrayInputStream bis = new ByteArrayInputStream(buff);
			ObjectInputStream ois= new ObjectInputStream(bis);
			
			//执行反序列化,强转
			Animal m = (Animal)ois.readObject();
			System.out.println(m.toString());
			
			ois.close();
			ris.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值