解决ObjectInputStream的readObject()方法的EOF异常

  先牢骚一下,这个破问题困扰了我太久了…唉。。。。其实很简单

 先举一个例子吧。。。序列化两个对象,写入文件,然后再读出来

Code:
  1. import java.io.FileInputStream;  
  2. import java.io.FileNotFoundException;  
  3. import java.io.FileOutputStream;  
  4. import java.io.IOException;  
  5. import java.io.ObjectInputStream;  
  6. import java.io.ObjectOutputStream;  
  7. import java.io.Serializable;  
  8.   
  9. public class ObjectStream {  
  10.     public static void main(String[] args) {  
  11.         ObjectOutputStream oos = null;  
  12.         ObjectInputStream ois = null;  
  13.         Person pe = null;  
  14.         try {  
  15.             FileOutputStream out = new FileOutputStream("D:/obj.txt");  
  16.             oos = new ObjectOutputStream(out);  
  17.             Person per = new Person("微软"14);  
  18.             pe = new Person("金山"20);  
  19.             oos.writeObject(per);  
  20.             oos.writeObject(pe);  
  21.             oos.writeObject(null);//解决EOF的关键,加入一个空的对象  
  22.             System.out.println("添加成功");  
  23.             oos.close();  
  24.             out.close();  
  25.         } catch (FileNotFoundException e) {  
  26.             e.printStackTrace();  
  27.         } catch (IOException e) {  
  28.             e.printStackTrace();  
  29.         }  
  30.           
  31.         try{  
  32.             FileInputStream in = new FileInputStream("D:/obj.txt");  
  33.             ois = new ObjectInputStream(in);  
  34.             Object obj=null;  
  35.             while((obj=ois.readObject())!=null) {  
  36.                 Person s = (Person)obj;  
  37.                 System.out.println(s);  
  38.             }  
  39.             ois.close();  
  40.             in.close();  
  41.         } catch(Exception e) {  
  42.             e.printStackTrace();  
  43.         }  
  44.     }  
  45. }  
  46.   
  47. class Person implements Serializable {  
  48.     private String name;  
  49.     private /*transient*/ int age;  
  50.       
  51.     public Person(String name, int age) {  
  52.         this.name = name;  
  53.         this.age = age;  
  54.     }  
  55.       
  56.     public String getNmae(){  
  57.         return name;  
  58.     }  
  59.     public void setName(String name) {  
  60.         this.name = name;  
  61.     }  
  62.   
  63.     public int getAge() {  
  64.         return age;  
  65.     }  
  66.   
  67.     public void setAge(int age) {  
  68.         this.age = age;  
  69.     }  
  70.       
  71.     public String toString() {  
  72.         return "姓名:" + name + "  性别:" + age;  
  73.     }  
  74.   
  75. }  

  大家看第21行,在这里追加了一个空对象,因为在第35行的循环中,正确读取了两个对象之后,还会在读一次,此时已经没有东西可读,就会抛出EOF错误,判断条件是不等于空,那我们自己就在文件的后面追加一个空对象不就解决了?

  - -

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值