2

我正在尝试将包含 Contact 类型的序列化对象的文件读入 ArrayList contactsCollection。我遇到的问题是对象联系人永远不会添加到 ArrayList 中。

try
{
    ObjectInputStream in = new ObjectInputStream(new FileInputStream("contactList.dat"));
    Contact temp;
    while (in.available()!=0)
    {
        temp = (Contact)in.readObject();
        contactsCollection.add(temp);

    }
    in.close();
}
4

3 回答 3

4

这是 ObjectInputStream.available 的已知行为,它始终返回 0,请参见http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4954570。相反,您可以从文件中读取对象,直到抛出 EOFException,捕获它并中断。

于 2013-05-16T01:50:25.387 回答
3

实际上,您的整个方法都是错误的:您应该序列化List,而不是每个对象。

所有 List 实现都是Serializable. 只需创建列表,添加您的 onjbects 并序列化列表 - 其中的对象也将被序列化(如果它们实现Serializable,这显然是您的工作)。

然后反序列化,只需读入对象,瞧——你有一个列表,其中已经添加了我们所有的对象。

于 2013-05-16T02:09:29.050 回答
2

ArrayListsSerializable提供它们的内容。如果将Contacts 存储到流中的代码将它们包含在 中ArrayList,则只需一次读取所有列表。

如果没有,您可能希望存储Contacts 的代码首先存储长度:

try (FileInputStream fis = new FileInputStream("contactList.dat"),
     ObjectInputStream in = new ObjectInputStream(fis)) {
    int size = in.readInt();
    for (final int i = 0; i < size; ++i) {
        contacts.add((Contact) in.readObject());
    }
} catch (IOException e) {
    // Handle exception
}

混和是不明智的available;会告诉有多少字节可用而不会导致流阻塞,除了 Evegniy 的评论适用。这些字节可能不代表一个完整的对象。readObjectavailable

如果您无法将代码写入流以将大小放在首位,则只需循环并依赖于 anEOFExceptionIOException.

于 2013-05-16T01:53:53.997 回答