次のユースケースがあります。
- プロセスは、を使用して特定のオブジェクトをファイルにシリアル化します
BufferedOutputStream
。 - 各オブジェクトを書き込んだ後、プロセスはを呼び出します
flush()
- ユースケースは、オブジェクトの書き込み中にプロセスがクラッシュした場合、正常に書き込まれた前のオブジェクトまでファイルを回復したいというものです。
このようなファイルを逆シリアル化するにはどうすればよいですか?そのようなファイルを逆シリアル化する間、Javaはどのように動作しますか。
- クラッシュする前に正常に書き込まれたオブジェクトまで正常に逆シリアル化されますか?
- 最後に部分的に書き込まれたオブジェクトを読み取っている間、動作はどうなりますか。どうすればそれを検出できますか?
Update1-
- オブジェクトの書き込み中にプロセスを手動で強制終了することで、プロセスのクラッシュをシミュレートしようとしました。私は約10〜15回試しましたが、毎回ファイルを逆シリアル化でき、ファイルに部分的なオブジェクトがありません。
私のテストが十分に網羅的であるかどうかはわかりません。したがって、さらにアドバイスが必要です。
Update2- Adamは、ファイルをランダムに切り捨てることを使用して、このようなテストをシミュレートできる方法を指摘していました。以下は、約100回の反復を試したときに観察された動作です-
- 切り捨てられたファイル(プロセスがクラッシュしたときのファイルの状態と同等である必要があります)から、Javaは最後の完全なオブジェクトまで正常に読み取ることができます。
- 最後に部分的に書き込まれたオブジェクトに到達すると、Javaは
StreamCorruptedException
またはをスローしませんIOException
。単にEOFException
指示されたものをスローEOF
し、部分的なオブジェクトを無視します。