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