IO序列号AC

Person

分享图片

 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

分享图片

 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

分享图片

 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信息之前

分享图片

追加之后

分享图片

 

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

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

解决方法:

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

分享图片

 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信息,这里让他不进行任何操作,其他的全部使用父类方法

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

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...