我正在尝试将包含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();
}
答案 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)
ArrayList
是Serializable
提供的内容。如果将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
}
混合available
和readObject
是不明智的;除了Evegniy的评论适用之外,available
将告知有多少字节可用而不会导致流阻塞。这些字节可能不代表完整的对象。
如果您无法将代码写入流中以将大小放在第一位,那么您只需循环并依赖于EOFException
是IOException
的事实。