关于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] 展开
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] 展开
3个回答
展开全部
我怎么觉得 问题不是那样,,,
我举一个例子啊,
比如 我有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个.....
//前提是 不追究流用法.....
我举一个例子啊,
比如 我有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个.....
//前提是 不追究流用法.....
展开全部
首先分别检查一下你个Student和Car是否已经序列化,如果还有问题不要用List先用手动输出到文件,看看读出的时候有没有问题,有问题我也不知道啦:) 没有问题的话就是List的问题了。。。
我刚才试了 下不能每次都重新 oip=new ObjectInputStream(bis); 每次都构造,应该是会从文件开头开始读的,但是你有一个缓冲区,可能是你在以后读的时候构造了程序认为从文件头开始,结果实际上是缓冲的文件半截开始导致的Exception吧
我刚才试了 下不能每次都重新 oip=new ObjectInputStream(bis); 每次都构造,应该是会从文件开头开始读的,但是你有一个缓冲区,可能是你在以后读的时候构造了程序认为从文件头开始,结果实际上是缓冲的文件半截开始导致的Exception吧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询