Java读取序列化对象从文件到arrayList

时间:2013-05-16 01:27:30

标签: java serialization arraylist io

我正在尝试将包含Contact类型的序列化对象的文件读入ArrayList contactsCollection。我遇到的问题是对象Contact永远不会被添加到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();
}

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:2)

ArrayListSerializable提供的内容。如果将Contact存储到流中的代码将其存储在ArrayList中,则只需一次读取所有列表。

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

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
}

混合availablereadObject是不明智的;除了Evegniy的评论适用之外,available将告知有多少字节可用而不会导致流阻塞。这些字节可能不代表完整的对象。

如果您无法将代码写入流中以将大小放在第一位,那么您只需循环并依赖于EOFExceptionIOException的事实。

相关问题