在java中处理EOFException

时间:2010-11-16 22:54:08

标签: java

我已经在我的java赋值中创建了一个方法来写入LinkedList的文件(我使用了序列化),然后我创建了另一个方法来将文件读入inkedList。以下是我方法的正文:

try {
    FileInputStream fin = new FileInputStream("c:\\Info.ser");
    ObjectInputStream ois = new ObjectInputStream(fin);


    Employee e = (Employee) ois.readObject();
    linkP.add(e);


} catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

但它无法正常工作。我想这一部分:

Employee e = (Employee) ois.readObject();
linkP.add(e);

只将文件的第一个对象读入到链表中并忽略其他对象。我将它包围for循环和while循环几次,但它导致EOFException。如何更改我的方法以将所有文件的对象读入LinkedList?

7 个答案:

答案 0 :(得分:3)

如果使用LinkedList进行序列化,则应该期望LinkedList反序列化:

 linkP= (LinkedList) ois.readObject(); 

而不是

Employee e = (Employee) ois.readObject();   
    linkP.add(e);  

答案 1 :(得分:1)

确定序列化文件是否包含所有元素?在我看来,你可能只是序列化一个。

答案 2 :(得分:1)

最简单的方法是将列表的大小作为写入文件的第一件事。当您读取文件时,您检索的第一件事就是大小。然后,您可以读取预期的对象数。

答案 3 :(得分:1)

注意:还请添加创建info.ser文件的代码,因为您可能通过关闭/重新打开每个对象来损坏ObjectOutputStream。

但是要回答你的问题,正确这样做的方法(没有捕获例外)将是:

@Test
public void testSerializingListByEntries() throws Exception {
    List<Serializable> list = new ArrayList<Serializable>();
    list.add(new Date());
    list.add(new Date());

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(baos);
    oos.writeInt(list.size()); // Magic
    for(Serializable o : list) {
        oos.writeObject(o);
    }
    oos.close();

    ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
    ObjectInputStream ois = new ObjectInputStream(bais);
    int count = ois.readInt();
    List<Object> newList = new ArrayList<Object>();
    for(int i = 0; i < count;i++) {
        newList.add(ois.readObject());
    }
    ois.close();
    assertEquals(list,newList);
}

是的,你需要自己关闭溪流。为了便于阅读而省略。

答案 4 :(得分:0)

可能需要先了解你的写作方式,但通常是:

ObjectInputStream is = null;
try 
{
    is = new ObjectInputStream(new FileInputStream("c:/Info.ser"));
    Object object = null;
    while ((object = is.readObject()) != null) 
    {
        linkP.add(object);
    }
}
catch(Exception e)
{
    //Whatever you need to do
}
finally 
{
    //Never forget to close your streams or you'll run into memory leaks
    try 
    {
        if (is != null) 
        {
            is.close();
        }
    } 
    catch (Exception ex) 
    {
        ex.printStackTrace();
    }
}

此外,它可能更好的做法,你可以单独处理异常,但我无法确定流抛出什么,所以用其他所有东西替换(例外e)。

答案 5 :(得分:0)

环绕Employee e = (Employee) ois.readObject(); linkP.add(e); 并按照建议使用for循环,并使用.readObject

围绕try/catc(EOFException)来电

答案 6 :(得分:0)

只需在读取循环中单独捕获EOFException并相应地处理它,即跳出循环。