java.io.StreamCorruptedException:無効なタイプコード:ACエラーの解決策



Java Io Streamcorruptedexception



問題の説明:

シリアル化可能なオブジェクトをファイルに書き込むときは、ファイルの最後にシリアル化可能なオブジェクトを追加するだけなので、FileOutputStream(ファイル名、true)を使用して、ObjectOutputStreamストリームオブジェクトを間接的に構築し、読み取ります。データを初めて実行するとき、エラーは報告されません。 2回目は、java.io.StreamCorruptedException:無効なタイプコード:ACエラーを報告します。



理由:

ファイルには、ファイルヘッダーとファイル本文があります。 FileOutputStream(ファイル名、true)を使用して構築されたObjectOutputStreamオブジェクトは、同じファイルにデータを複数回書き込むため、データが書き込まれるたびに、書き込みたいオブジェクトデータを書き込むためにファイルの最後にヘッダーを書き込みます。ファイルの本文でこのヘッダーに遭遇すると、エラーが発生します。読み取りが発生すると、streamcorrput例外が発生します(ストリーム内の制御情報に一貫性がありません)。
継続のみが最初にヘッダーに書き込まれます。継続でない場合、複数のオブジェクトに書き込むと、ファイルヘッダーは1回だけ書き込まれます。 1回の継続で複数のオブジェクトが書き込まれる場合でも、ファイルヘッダーのみが1回書き込まれます。



知識予備:
各ファイルには、ヘッダーとファイル本体があります。
オブジェクト出力ストリーム(ObjectOutputStream)には、保護されたメソッドwriteStreamHeader():voidがあります。これは、特にファイルのヘッダーを書き込むためのものです。

解決策:ここで、ファイルがヘッドに書き込まれる場合はファイルを書き込むのが初めてかどうか、それ以外の場合は書き込まれないかどうかを判断します。

コード例:



import java.io.* public class MyObjectOutputStream extends ObjectOutputStream{ public MyFileOutputStream(){ super() } public MyFileOutputStream(OutputStream o){ super(o) } public void writeStreamHeader(){}/ / This overrides the method in the parent class, so that he does not write to the file header when calling writeObject() } class Demo{ public static void main(String[] args){ File file=new File(xxxxxxx) ObjectOutputStream out / / Determine whether the file exists to determine which objectoutputstream to use if(file.isFile()){ out=new MyObjectOutputStream(xxxx) } else{ out=new ObjectOutputStream(xxxxx) } } } $(function(){$( 'pre.prettyprint code')。each(function(){var lines = $(this).text()。split( ' n')。length var $ numbering = $( '
    ').addClass(' pre-numbering ')。hide()$(this).addClass(' has-numbering ')。parent()。append($ numbering)for(i = 1 i<= lines i++) { $numbering.append($('
  • ').text(i))} $ numbering.fadeIn(1700)})})