无法解决java.io.EOFException?

时间:2014-03-28 05:38:44

标签: java file-io

这是我的第一个档案

   public class ObjectStream 
     {
       public static void main(String args[]) throws FileNotFoundException, IOException
     {
     java.io.File f=new java.io.File("D:Employee.outt") ;  
      Employee e=new Employee("John");
      Employee e1=new Employee("Mary");
         Employee e2=new Employee("Christian");
       OutputStream os=new java.io.FileOutputStream(f);

       java.io.ObjectOutputStream oos=  new ObjectOutputStream(os);
      oos.writeObject(e);
       oos.writeObject(e1);
         oos.writeObject(e2);
      }
      }

这是我的第二个档案

    public class Employee implements java.io.Serializable
    {
     private static int count=100;
    private int eid;
     private String ename;

     public Employee()
    {
     count++;
     this.eid=count;        
    }

    public Employee(String ename)
   {
    this();
    this.ename=ename;        
    }

    public static int getCount() {
       return count;
     }

    public static void setCount(int count) {
      Employee.count = count;
     }

     public int getEid() {
      return eid;
      }

    public void setEid(int eid) {
      this.eid = eid;
    }

    public String getEname() {
      return ename;
     }

     public void setEname(String ename) {
         this.ename = ename;
   }

   }

这是我的第三个档案

      public class MainClass
    {
         public static void main(String args[]) throws FileNotFoundException,        IOException, ClassNotFoundException
       {
        File f=new File("D:Employee.outt");
       byte data[]=new byte[(int)f.length()];
    InputStream is=new java.io.FileInputStream(f);
      java.io.ObjectInputStream ois=new java.io.ObjectInputStream(is);
    Object o=ois.readObject();



    while(o!=null)
         {
   Employee e=(Employee)o;
   System.out.println(e.getEid());
   System.out.println(e.getEname());
     o=ois.readObject();
       }


    ois.close();
    is.close();
     }
     }

我试图通过这个第三个文件读取存储在Employee.outt中的对象,但它正在读取所有对象,但最后抛出

  

线程“main”中的异常java.io.EOFException。

我不知道如何解决它。

3 个答案:

答案 0 :(得分:2)

while(o!=null)

这不是读取ObjectInputStream.的有效方法。readObject()方法只有在写入null时才返回null。在流结束时,它抛出,猜测是什么,EOFException,所以读取流的正确方法是循环调用`readObject()直到捕获该异常,然后断开并关闭流。

  

在文件末尾它给出了EOF异常

这正是EOFException的含义。

答案 1 :(得分:1)

您应该在ObjectOutputStream课程中关闭ObjectStream

oos.writeObject(e);
oos.writeObject(e1);
oos.writeObject(e2);

oos.close();

MainClass 中,您可以使用 try-finally 块来关闭输入流。

try
{   
  InputStream is=new java.io.FileInputStream(f);
  java.io.ObjectInputStream ois=new java.io.ObjectInputStream(is);    

    // READ logic here   
}
finally
{    
 ois.close();
 is.close();  
}

答案 2 :(得分:1)

  1. 您真的应该在“第一个文件”中刷新并关闭对象输出流。

  2. 您只需关闭“第三档”中的“ois”即可。另一个流会自动关闭。

  3. 如果您知道要编写多少个对象,请先更改“第一个文件”以写入后面的对象数,然后更改“第三个文件”以读取该数字并仅读取该对象。这样,你永远不会得到EOF异常,因为当你读完最后一个对象时你会停止阅读。

  4. 正如EJP指出的那样,你仍然需要捕获EOFException,因为你正在阅读的文件可能已经损坏。

    在第一个文件中:

    ...
    oos.writeInt(3);
    oos.writeObject(e);
    ...
    

    在第三档:

    ...
    try {
      int numObjects = ois.readInt();
      for( int a = 0; a < numObjects; ++a ) {
          ...
      }
    } catch( EOFException e ) {
        ...
    }