我有以下用例。
- 进程将某些对象序列化为使用
BufferedOutputStream
. - 写完每个对象后,进程调用
flush()
- 用例是如果进程在写入对象时崩溃,我想将文件恢复到已成功写入的前一个对象。
我怎样才能反序列化这样的文件?反序列化此类文件时 Java 将如何表现。
- 它会成功反序列化到崩溃前成功写入的对象吗?
- 在读取最后一个部分写入的对象时,会发生什么行为。我怎样才能检测到呢?
更新1 -
- 我试图通过在写入对象时手动终止进程来模拟进程崩溃。我已经尝试了大约 10-15 次。每次我能够反序列化文件并且文件没有任何部分对象。
我不确定我的测试是否足够详尽,因此需要进一步的建议。
Update2 - Adam 指出了一种可以使用随机截断文件来模拟此类测试的方法。以下是尝试大约 100 次迭代时观察到的行为 -
- 从截断的文件(应该相当于进程崩溃时文件的条件),Java可以成功读取到最后一个完整的对象。
- 在到达最后一个部分写入的对象时,Java 不会抛出任何
StreamCorruptedException
或IOException
. 它只是抛出EOFException
指示EOF
并忽略部分对象。