2014-03-28 23 views
1

这是我的第一个文件无法解析java.io.EOFException?

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。

我不知道如何解决它。

+0

您是否已经验证文件路径和名称?它不应该是'D:\\ Employee.outt'吗? –

+0

@Shishir是的我有它正在阅读文件,在阅读文件没有问题,但在文件结束时给EOF异常。 – TruePS

+0

[EOFException在使用ObjectInputStream读取文件时可能的重复](http://stackoverflow.com/questions/12684072/eofexception-when-reading-files-with-objectinputstream) –

回答

2
while(o!=null) 

这不是阅读ObjectInputStream.,如果你写了一个空的readObject()方法只返回一个空的有效方法。在流结束时,它会猜出,EOFException,,因此正确读取流的方式是循环调用readObject(),直到捕获到异常,然后中断并关闭流。

的文件,它给EOF异常

这正是EOFException手段结束。

+0

但我的朋友通过做同样的事情运行相同的程序。我只是不想捕捉异常我只是想知道什么时候对象达到流的结束并关闭我的循环,就像在EOF达到它时返回-1和Filereader中一样,并返回-1我们关闭我们的循环。 – TruePS

+1

你也可以首先发送多少个物体的长度,然后你可以停止阅读。 – centic

+1

您没有任何选择。这就是API的工作原理。它抛出'EOFException:'你必须赶上它。您不能依赖@centic所建议的文件中的信息:文件过早结束仍然可能发生在现实世界中,并且您仍然必须正确处理它。 – EJP

1

您需要在ObjectStream类中关闭ObjectOutputStream

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

oos.close(); 

MainClass可以使用尝试,终于块关闭InputStream。

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(); 
} 
+0

不,它给出流关闭错误,因为我正在读取3个对象循环中。 – TruePS

+1

@TruePS不,它不会,除非你把close放到读循环中,这不是他在这里所建议的。他说你应该在完成写作之后关闭流,但这并不能解决你的实际问题。 – EJP

+0

@EJP我还没有读完流,所以如何在读取整个流之前关闭流。如果我想读取100个对象,那么如果我关闭循环中的流。如何能够读取其他99个对象。 – TruePS

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

  2. 您只需要在“第三个文件”中关闭'ois'。另一个流将自动关闭。

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

正如EJP指出的那样,您仍然必须捕捉EOFException,因为您正在阅读的文件可能已损坏。

在第一个文件:

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

在第三档:

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

除非出现写错文件的错误,否则您将永远不会得到'EOFException'',这是您在现实世界中无法排除的,所以您*会*得到它,所以你必须防守代码反对它。 – EJP

+1

非常正确,您仍然需要捕获EOF异常,但现在它确实是一个异常情况,而不是滥用。 – EdwinW

+1

我对讨论异常处理的意见不感兴趣。我只想讨论如何使用这个已经设计好的API。 – EJP