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

Java读取将对象从文件序列化到arrayList中,java,serialization,arraylist,io,Java,Serialization,Arraylist,Io,我正在尝试将包含Contact类型的序列化对象的文件读取到ArrayList Contacts集合中。我遇到的问题是,对象联系人从未添加到ArrayList中 try { ObjectInputStream in = new ObjectInputStream(new FileInputStream("contactList.dat")); Contact temp; while (in.available()!=0) { temp = (Cont

我正在尝试将包含Contact类型的序列化对象的文件读取到ArrayList Contacts集合中。我遇到的问题是,对象联系人从未添加到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();
}

这是ObjectInputStream.available的已知行为,它始终返回0,请参阅。相反,您可以从文件中读取对象,直到抛出EOFEException,捕获它并中断

ArrayList
s是可序列化的,只要它们的内容是可序列化的。如果将
联系人
存储到流中的代码在
数组列表
中,只需一次读取所有列表

如果不是,您可能希望存储联系人的代码首先存储长度:

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
}
try(FileInputStream fis=newfileinputstream(“contactList.dat”),
ObjectInputStream in=新的ObjectInputStream(fis)){
int size=in.readInt();
用于(最终整数i=0;i
混合
可用
读取对象
是不明智的
available
将告诉您有多少字节可用,而不会导致流阻塞,但Evegniy的注释适用。这些字节可能不代表完整的对象


如果您无法让代码写入流以将大小放在第一位,那么您只需循环并依赖于
EOFEException
IOException

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

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


然后要反序列化,只需读入对象,瞧-您已经有了一个包含所有添加对象的列表。

然后in.available()为0,您确定该文件中有联系人吗?我同意@greedybuddha,在分配temp后打印出一些内容,以确保temp不为空,您正在到达那里,您是否可以尝试调试并查看执行流程。
in.available()!=0
不是流结束的有效测试。