2009-06-10 18 views
5

ObjectOutputStreamを使用して、シリアル化されたオブジェクトのファイルを作成しています。次に、ObjectInputStreamをreadObject()メソッドと一緒に使用して、オブジェクトをファイルから戻します。ObjectInputStreamエラー

それは最初の時間を素晴らしい作品。つまり、ファイルが存在せず、それを開いてオブジェクトを追加すると、ObjectInputStreamオブジェクトを開き、すべてのオブジェクトにアクセスできます。

しかし、後で同じファイル(appendオプションを使用)を開いてオブジェクトを追加すると、ObjectInputStreamオブジェクトはjava.io.StreamCorruptedExceptionを取得します。新しいオブジェクトが開始する「無効な型コード:AC」エラーです。

誰かがこれに遭遇しましたか?私はDeitelの本からいくつかの基本的な教科書の例に戻りましたが、それでも同じエラーが発生します。

編集:私はこれを見つけた - それは追加モードで閉じられ、再び開かれた後あなたはシリアル化されたストリームの最後に追加しない場合があります。書き込みは機能しているように見えますが、後でファイルを読むときにjava.io.StreamCorruptedExceptionが発生します。 「http://mindprod.com/jgloss/gotchas.html#SERIALIZATION

答えて

4

に各オブジェクトは、オブジェクトのストリームの一部としてではなく、個人としてserailisedれます。 「オブジェクトストリームシリアル化プロトコル」は、ほとんどのファイル形式(ZIPではなく)のようにヘッダーを持っています。これは、すべての新しいObjectInputStreamがファイルの先頭でしか見つからないと考えているものです。ストリームの真ん中に置くことはうまくいかない。また、ストリームには後方参照があるため、オブジェクトが2度書き込まれることはありません(特に指定しない限り)。

だから、ObjectOutputStreamに一致するように新しいを作成する必要があります。何らかの内部バッファリングがあります。その場合、ストリームをスライスしてからObject(In|Out)putStreamを取り除く必要がある問題が発生します。

+0

出力ストリームと入力ストリームの間に直接の相関はありません。同じ日やワークステーションで実行されることさえありません。ある情報はファイルに保存され、後で別のプロセスがオープンして読み込む必要があります。 –

1

ストリームの生産者と消費者が独立している場合は、単に出力ファイルを毎回上書きし、消費者がリロードするその時間を知っているので、タイムスタンプのファイルを追加するために、それは理にかなっています。

例えば、

SomeObject[] obj = new SomeObject[numObjects]; 
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("file"); 
out.writeObject(obj); 
out.close(); 
long ts = System.currentTimeMillis(); 
ObjectOutputStream tout = 
     new ObjectOutputStream(new FileOutputStream("timestamp.obj"); 
tout.writeObject(new Long(ts)); 

消費者はその後、数分ごとtimestamp.objファイルをポーリングすることができますし、それが変更された場合、ストリームからSomeObject[]を再度開きます。

ObjectInputStream in = 
     new ObjectInputStream(new FileInputStream("timestamp.obj")); 
Long ts = (Long)in.readObject(); 

if (ts > prevts) { 
    ObjectInputStream in2 = new ObjectInputStream(new FileInputStream("file")); 
    SomeObject[] obj = (SomeObject[])in.readObject(); 
    prevts = ts; 
} 
1

ObjectStreamにはヘッダーとフッターが含まれています。また、ステートフルな情報も含まれています。つまり、書き込んだ内容は、すでに記述したオブジェクトに基づいています。

このように、あなただけの既存のObjectStreamのに追加することはできません。あなたができることはファイルを書き換えて、毎回オブジェクトを追加することです。ストリームを独自のプロトコルでラップすることで、複数のストリームを正しく読み書きできます。

あなたが/同じコードベースでデータを読み書きする際ObjectStreamのが最も適しています(特にクラスについては、書き込み/読み出し)がObjectStreamのは、コードのか、異なるアプリケーション間のバージョン間で移植できるように設計されていません。

+0

どのストリームを使用したか?? 返信してください –

+0

@AnshulParashar ObjectOutputStreamとObjectInputStreamです。 –

関連する問題