解决循环操作ObjectInputStream的readObject()方法的EOF异常

来源:互联网 发布:plc编程实例详解 编辑:程序博客网 时间:2024/05/22 12:34
Code:
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.io.Serializable; 
 
public class ObjectStream { 
    public static void main(String[] args) { 
        ObjectOutputStream oos = null; 
        ObjectInputStream ois = null; 
        Person pe = null; 
        try { 
            FileOutputStream out = new FileOutputStream("D:/obj.txt"); 
            oos = new ObjectOutputStream(out); 
            Person per = new Person("微软", 14); 
            pe = new Person("金山", 20); 
            oos.writeObject(per); 
            oos.writeObject(pe); 
            oos.writeObject(null);//解决EOF的关键,加入一个空的对象 
            System.out.println("添加成功"); 
            oos.close(); 
            out.close(); 
        } catch (FileNotFoundException e) { 
            e.printStackTrace(); 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } 
         
        try{ 
            FileInputStream in = new FileInputStream("D:/obj.txt"); 
            ois = new ObjectInputStream(in); 
            Object obj=null; 
            while((obj=ois.readObject())!=null) { 
                Person s = (Person)obj; 
                System.out.println(s); 
            } 
            ois.close(); 
            in.close(); 
        } catch(Exception e) { 
            e.printStackTrace(); 
        } 
    } 

 
class Person implements Serializable { 
    private String name; 
    private int age; 
     
    public Person(String name, int age) { 
        this.name = name; 
        this.age = age; 
    } 
     
    public String getNmae(){ 
        return name; 
    } 
    public void setName(String name) { 
        this.name = name; 
    } 
 
    public int getAge() { 
        return age; 
    } 
 
    public void setAge(int age) { 
        this.age = age; 
    } 
     
    public String toString() { 
        return "姓名:" + name + "  性别:" + age; 
    } 
 

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

0 0
原创粉丝点击