IO序列号AC

Person

IO序列号AC
 1 package MyTest;
 2 
 3 import java.io.Serializable;
 4 
 5 public class Person implements Serializable {
 6     /**
 7      * 
 8      */
 9     private static final long serialVersionUID = 1L;
10     private String name;
11     private int age;
12 
13     public Person(String name, int age) {
14         super();
15         this.name = name;
16         this.age = age;
17     }
18 
19     @Override
20     public String toString() {
21         return name + "\t" + age;
22     }
23 }
View Code

FileOutputStream

IO序列号AC
 1 package MyTest;
 2 
 3 import java.io.File;
 4 import java.io.FileOutputStream;
 5 import java.io.ObjectOutputStream;
 6 
 7 
 8 public class Out {
 9     public static void main(String[] args) throws Exception{
10         File file = new File("1.txt");
11         FileOutputStream fos = new FileOutputStream(file,true);
12         ObjectOutputStream oos = new ObjectOutputStream(fos);
13         oos.writeObject(new Person("qwe",18));
14         oos.writeObject(new Person("abc",20));
15         oos.close();
16     }
17 }
View Code

ObjectInputStream

IO序列号AC
 1 package MyTest;
 2 
 3 import java.io.File;
 4 import java.io.FileInputStream;
 5 import java.io.ObjectInputStream;
 6 
 7 public class In {
 8     public static void main(String[] args) throws Exception {
 9         File file = new File("1.txt");
10         FileInputStream fis = new FileInputStream(file);
11         ObjectInputStream ois = new ObjectInputStream(fis);
12         while(fis.available()>0) {
13             System.out.println(ois.readObject());            
14         }
15         ois.close();
16     }
17 }
View Code

没有true追加进txt信息之前

IO序列号AC

追加之后

IO序列号AC

 

问题描述:在使用java.io.ObjectInputStream类的readObject()方法去读取包含有序列化了多个(两个及两个以上)类的文件时,当读取到第二个类时,会抛出题目中提到的异常.

原因:任何一个文件都有文件头(header)和文件体(body),java在以追加的方式写一个文件时,他每次都会向文件追加一个header,该header是无法识别的,所以回抛出该异常

解决方法:

    java提供的对象输出流无法解决该问题,我们可以自己写一个java.io.ObjectOutputStream类的子类,该子类如下:

IO序列号AC
 1 package MyTest;
 2 
 3 import java.io.IOException;
 4 import java.io.ObjectOutputStream;
 5 import java.io.OutputStream;
 6 
 7 public class MyObjectOutputStream extends ObjectOutputStream {
 8     protected MyObjectOutputStream() throws IOException, SecurityException {
 9         super();
10     }
11 
12     @Override
13     protected void writeStreamHeader() throws IOException {
14         super.writeStreamHeader();
15     }
16 
17     public MyObjectOutputStream(OutputStream out) throws IOException {
18         super(out);
19     }
20 }
View Code

该类重写了父类中的writeStreamHeader()方法,该方法用于写入header信息,这里让他不进行任何操作,其他的全部使用父类的方法

在逻辑代码中,判断要写入的文件是否是第一次输入即可,代码如下:

 

上一篇:常用IO输入输出流


下一篇:序列化流与反序列化流