如何连续读取对象

时间:2016-02-08 18:24:15

标签: java serialization

我已将Objects写入.bin文件,我试图将它们读入控制台,但是这个

try(ObjectInputStream ois = new ObjectInputStream(new FileInputStream("file.bin"))){
    for(Ser s = (Ser)ois.readObject(); s = (Ser)ois.readObject(); s!=null)
        System.out.println(s);
}catch (IOException | ClassNotFoundException e){
    e.printStackTrace();
}

在for循环增量的第二行给出错误:类型不匹配:无法从Ser转换为布尔,我该怎么做?

4 个答案:

答案 0 :(得分:1)

在:

for(Ser s = (Ser)ois.readObject(); s = (Ser)ois.readObject(); s!=null)

在第一个;之后:

; s = (Ser)ois.readObject();

假设给出boolean结果。

也许你真正想要的是:

for(Ser s = (Ser)ois.readObject(); s!=null; s = (Ser)ois.readObject())

答案 1 :(得分:1)

你的循环子句不匹配。这是

for(declarations; exit_check; increment)

在您尝试使用的模式中,您通常会执行类似

的操作
for(Ser ser = null; (ser = (Ser)ois.readObject()) != null; /*blank*/) {
   //do something
}

答案 2 :(得分:1)

for(Ser s = (Ser)ois.readObject(); s = (Ser)ois.readObject(); s!=null)

应该是

try {
    for(Ser s = (Ser)ois.readObject();; s = (Ser)ois.readObject())
    {
         //Code
    }
} catch(EOFException ex)
{
    //EOF found
}

相反。 在for循环中,条件应该在第二行,而不是在第三行。

因为javac正在第二行查找条件并找到sSer的实例,它说s无法转换为boolean。< / p>

@EJP:

  

与大家似乎在想的相反,readObject()在流结束时不返回null。它抛出EOFException。

@EJP关于EOF是正确的,我编辑了我的答案,包括那个。

答案 3 :(得分:1)

无论如何,循环是错误的,尝试修复它没有意义。与每个人似乎在这里想到的相反,readObject()在流的末尾不会返回null。抛出EOFException.这就是你必须测试的东西:

try( ObjectInputStream ois = new ObjectInputStream(new FileInputStream("file.bin"))){
    for(;;) {
        Ser s = (Ser)ois.readObject();
        System.out.println(s);
    }
} catch (EOFException exc) {
    // end of stream: OK
} catch (IOException | ClassNotFoundException e){
    e.printStackTrace();
}