当前位置: 技术问答>java相关
java序列化问题(求救,高手在哪里)
来源: 互联网 发布时间:2015-01-26
本文导语: 我现在要实现,将大量数据存到文件中,类似股票分析软件里面把数据保存,可以将来再读取使用,但是我试了序列化以后发现序列化没有添加功能,只能覆盖原来的数据,难道要我自己写文件??这样不是太...
我现在要实现,将大量数据存到文件中,类似股票分析软件里面把数据保存,可以将来再读取使用,但是我试了序列化以后发现序列化没有添加功能,只能覆盖原来的数据,难道要我自己写文件??这样不是太麻烦了,请大家想想办法,谢谢了
|
以前没有碰到类似的情况,刚才研究了一下,是因为 ObjectOutputStream 在将 Object 写到文件的时候,会先写一个四字节的前导符,用来标记接下来的将是一个 Object 流(可以是很多个 Object 组成的流),但也只是在流的首部作这个标记。在中间的时候 writeObject 并不会产生这个标记。
但是当我们采用 append 的方式打开 FileOutputStream 的时候,尽管现在已经是处于文件中间(不应写前导符),但对于 ObjectOutputStream 来说,它并不知道这么一回事,所以也将这个前导符号写了进去,所以我们按顺序读 Object 的时候,便会产生错误。
这是我的一种临时解决方案,用了一个管道将前导符去掉,可能会很笨,不过一时没有想到其它办法。
55~ 我水平不到家,用了太久的时间。
import java.io.*;
import java.util.*;
public class SerializableObj implements Serializable
{
public static void main(String args[]) throws Exception
{
Obj obj = new Obj();
File file = new File("out.dat");
obj.generalWriteObject("out.dat", "Hello, world!", file.exists());
obj.generalWriteObject("out.dat", new Date(), file.exists());
obj.readObject();
}
void generalWriteObject(String filename, Object obj, boolean append) throws Exception
{
java.io.PipedInputStream pipeIn = new java.io.PipedInputStream();
java.io.PipedOutputStream pipeOut = new java.io.PipedOutputStream(pipeIn);
java.io.ObjectOutputStream objout = new java.io.ObjectOutputStream(pipeOut);
java.io.BufferedInputStream buffin = new java.io.BufferedInputStream(pipeIn);
objout.writeObject(obj);
objout.flush();
java.io.FileOutputStream fileOut = new java.io.FileOutputStream(filename, append);
if (append) buffin.skip(4);
int ch = -1;
int count = buffin.available();
int cur = 0;
while (cur
但是当我们采用 append 的方式打开 FileOutputStream 的时候,尽管现在已经是处于文件中间(不应写前导符),但对于 ObjectOutputStream 来说,它并不知道这么一回事,所以也将这个前导符号写了进去,所以我们按顺序读 Object 的时候,便会产生错误。
这是我的一种临时解决方案,用了一个管道将前导符去掉,可能会很笨,不过一时没有想到其它办法。
55~ 我水平不到家,用了太久的时间。
import java.io.*;
import java.util.*;
public class SerializableObj implements Serializable
{
public static void main(String args[]) throws Exception
{
Obj obj = new Obj();
File file = new File("out.dat");
obj.generalWriteObject("out.dat", "Hello, world!", file.exists());
obj.generalWriteObject("out.dat", new Date(), file.exists());
obj.readObject();
}
void generalWriteObject(String filename, Object obj, boolean append) throws Exception
{
java.io.PipedInputStream pipeIn = new java.io.PipedInputStream();
java.io.PipedOutputStream pipeOut = new java.io.PipedOutputStream(pipeIn);
java.io.ObjectOutputStream objout = new java.io.ObjectOutputStream(pipeOut);
java.io.BufferedInputStream buffin = new java.io.BufferedInputStream(pipeIn);
objout.writeObject(obj);
objout.flush();
java.io.FileOutputStream fileOut = new java.io.FileOutputStream(filename, append);
if (append) buffin.skip(4);
int ch = -1;
int count = buffin.available();
int cur = 0;
while (cur