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信息,这里让他不进行任何操作,其他的全部使用父类的方法
在逻辑代码中,判断要写入的文件是否是第一次输入即可,代码如下: