关于java序列化多个对象存取与读取的问题(万分感谢)

importtravelsky.eb.yteng.model.Student;publicclassSerializableTestListError{privatest... import travelsky.eb.yteng.model.Student;
public class SerializableTestListError {
private static List<Student> listStudentObject=new ArrayList<Student>();
private static List<Car> listCarObject=new ArrayList<Car>();
private static List<Object> listObject=new ArrayList<Object>();
public static void main(String[] args) throws IOException {
Student stu1=new Student(001, "yteng1", 20);
Student stu2=new Student(002,"yteng2",21);
Car car1=new Car("DazsAuto", "ShangHai", 200000.0);
Car car2=new Car("Ford","JiangSu",30000.00);
SerializableTestListError serializableTestInstance= new SerializableTestListError();
listObject.add(car2);
listObject.add(car1);
listObject.add(stu1);
listObject.add(stu2);
writeObject2File(listObject,"D:\\date1.txt");
try {
readObjectFromFile("D:\\date1.txt");
} catch (SerilizableException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
for(Iterator<Car> iterCar=listCarObject.iterator();iterCar.hasNext();){
System.out.println(iterCar.next());
}
for(Iterator<Student> iterStudent=listStudentObject.iterator();iterStudent.hasNext();){
System.out.println(iterStudent.next());
}
}
public static void writeObject2File(List<Object>o,String fileName) throws IOException{
FileOutputStream fout=new FileOutputStream(fileName,true);
ObjectOutputStream sout=new ObjectOutputStream(fout);
for(int i=0;i<o.size();i++){
sout.writeObject(o.get(i));
}
sout.close();
System.out.println("写入对象成功!");
}
public static void readObjectFromFile(String fileName) throws Exception{
FileInputStream fin=new FileInputStream(fileName);;
BufferedInputStream bis=new BufferedInputStream(fin);
ObjectInputStream oip=null;
while(true){
try{

oip=new ObjectInputStream(bis); //每次重新构造对象输入流
}catch(EOFException e)
{
System.out.println("已达文件末尾");//如果到达文件末尾,则退出循环
break;
}
Object object=new Object();
object=oip.readObject();
if(object instanceof Student) { //判断对象类型
listStudentObject.add((Student)object);
}
else if(object instanceof Car){
listCarObject.add((Car)object);
}
}
oip.close();
bis.close();
fin.close();
}
}错误如下: 跪求啊
java.io.StreamCorruptedException: invalid stream header: 7371007E
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:783)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:280)
at travelsky.eb.yteng.test.SerializableTestListError.readObjectFromFile(SerializableTestListError.java:78)
at travelsky.eb.yteng.test.SerializableTestListError.main(SerializableTestListError.java:43)
Student [id=1, name=yteng1, age=20]
展开
 我来答
codeboot
2012-07-13 · 超过37用户采纳过TA的回答
知道小有建树答主
回答量:207
采纳率:0%
帮助的人:111万
展开全部
我怎么觉得 问题不是那样,,,
我举一个例子啊,
比如 我有5个数字对象Num, 11111,1111,111111,1111,1
假设序列化后为存文件为:111110A11110A1111110A11110A10A

readObjectFromFile:

ObjectInputStream oip=null;
while(true){
try{
oip=new ObjectInputStream(bis); //每次重新构造对象输入流 ,+_+ 暂时就算这么用是正常的, 执行结果是完整的去读一个文件,
}catch(EOFException e)
{
System.out.println("已达文件末尾");//如果到达文件末尾,则退出循环
break;

//到这里为止,他就算读完一个文件了... 并且把文件中的所有内容保存到了oip 这个Stream,
// 实际上这个Stream 内容就是文件内容=(111110A11110A1111110A11110A10A )

}
Object object=new Object();
object=oip.readObject();//// 然后你把这个Stream转成一个对象......
// 明白了么? 怎么看都像是吧n个序列化后的对象反序列化成为1个.....

//前提是 不追究流用法.....
乐婴宝宝NO1
2012-07-13
知道答主
回答量:15
采纳率:0%
帮助的人:6.7万
展开全部
用 fastjson吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友feb84c5
2012-07-13 · TA获得超过170个赞
知道小有建树答主
回答量:219
采纳率:0%
帮助的人:149万
展开全部
首先分别检查一下你个Student和Car是否已经序列化,如果还有问题不要用List先用手动输出到文件,看看读出的时候有没有问题,有问题我也不知道啦:) 没有问题的话就是List的问题了。。。

我刚才试了 下不能每次都重新 oip=new ObjectInputStream(bis); 每次都构造,应该是会从文件开头开始读的,但是你有一个缓冲区,可能是你在以后读的时候构造了程序认为从文件头开始,结果实际上是缓冲的文件半截开始导致的Exception吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式