ObjectInputStream错误

5 java objectoutputstream objectinputstream

我正在使用ObjectOutputStream来创建序列化对象的文件.然后我使用ObjectInputStream与readObject()方法一起从文件中取出对象.

它第一次很棒.这意味着如果文件不存在并且我打开它然后附加任意数量的对象,我可以打开ObjectInputStream对象并访问所有对象.

但是,如果我随后打开相同的文件(使用append选项)并添加更多对象,则ObjectInputStream对象将获取java.io.StreamCorruptedException:"无效的类型代码:AC"错误,其中新对象应该启动.

有没有其他人遇到这个?我甚至回到了Deitel书中的一些基本教科书示例,但仍然得到了同样的错误.

编辑:我发现了这一点 - 一旦关闭并在追加模式下重新打开,您可能不会附加到序列化流的末尾.写入似乎有效,但是当您稍后再读取该文件时,您将获得java.io.StreamCorruptedException.在" http://mindprod.com/jgloss/gotchas.html#SERIALIZATION "

Tom*_*ine 4

每个对象都作为对象流的一部分而不是作为个体进行序列化。与大多数文件格式(但不是 ZIP!)一样,“对象流序列化协议”也有一个标头。这是每个新人都ObjectInputStream希望只能在文件开头找到的内容。将其放在流中间是行不通的。此外,流具有反向引用,因此不会两次写出对象(除非另有说明)。

因此,您需要创建一个新的ObjectInputStream来匹配每个ObjectOutputStream. 有一些内部缓冲,如果这导致问题,您需要在处理流之前将Object(In|Out)putStream其分割。