在Java中从文件中完全读取对象流的最佳方法是什么?

jon*_*rry 3 java serialization

我正在创建一个可能很长的对象日志,并且不希望在写入文件之前将它们全部保存在内存中,因此我无法将对象的序列化集合写入文件.我正在尝试在完成日志记录后找出整个对象流中的"最佳"读取方式.

我注意到以下内容不起作用:

FileInputStream fis = new FileInputStream(log);
ObjectInputStream in = new ObjectInputStream(fis);
while ((obj = in.readObject()) != null) {
  // do stuff with obj
}
Run Code Online (Sandbox Code Playgroud)

因为流在到达文件末尾时抛出异常而不是返回null(可能是因为可以向对象流写入/读取null,导致上述循环不按预期运行).

有没有更好的方法来完成我想用上面的循环完成的事情:

FileInputStream fis = new FileInputStream(log);
ObjectInputStream in = new ObjectInputStream(fis);
try {
  while (true) {
    obj = in.readObject();
    // do stuff with obj
  }
} catch (EOFException e) {
}
Run Code Online (Sandbox Code Playgroud)

这看起来有点笨拙.对于文件结束对象解决方案,以下是最佳方法吗?

private static final class EOFObject implements Serializable {
  private static final long serialVersionUID = 1L;
}

void foo() {
  Object obj;
  while (!((obj = in.readObject()) instanceof EOFObject)) {
    BidRequest bidRequest = ((BidRequestWrapper) obj).getBidRequest();
    bidRequestList.add(bidRequest);
  }
}
Run Code Online (Sandbox Code Playgroud)

Boz*_*zho 5

您的解决方案似乎很好 只需确保你有一个finally条款,你关闭你的流.

或者,您可以创建自己的EOF对象,并在最后添加它.因此,您可以检查当前读取的对象是否为EofObject,并且break此时.