2017-10-23 11 views
0

私はメモ柄のデザインパターンを利用したプログラムを持っており、各オブジェクトの状態をシリアライゼーションを使ってファイルに保存し、オブジェクトを元に戻したいと思っています。問題は、 "java.io.StreamCorruptedException:無効な型コード:AC"という例外が発生したことです。私はAppending to an ObjectOutputStreamを見てクラスを実装しようとしましたが、プログラムが正しく動作するようにはできませんでした。複数のオブジェクトをファイルに保存し、ユーザーがオブジェクトの文字列表現の一部に一致する関数に文字列を渡します。ObjectOutputStreamへの追加

public class Caretaker implements Serializable { 
public void addMemento(Memento m) { 
    try { 
     // write object to file 
     FileOutputStream fos = new FileOutputStream("ConeOutput1.txt", true); 
     BufferedOutputStream outputBuffer = new BufferedOutputStream(fos); 
     AppendableObjectOutputStream objectStream = new AppendableObjectOutputStream(outputBuffer); 
     objectStream.writeObject(m); 
     objectStream.reset(); 
     objectStream.close(); 
    } 
    catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

public Memento getMemento(String temp) { 
    try { 
    Memento result = null; 
    FileInputStream fis = new FileInputStream("ConeOutput1.txt"); 
    ObjectInputStream ois = new ObjectInputStream(fis); 
    result = (Memento) ois.readObject(); 
    while (result != null) { 
     Matcher m = Pattern.compile(temp).matcher(result.toString()); 
     if (m.find()) { 
      return result; 
     } 
     else { 
      result = (Memento) ois.readObject(); 
     } 
     ois.close(); 
    } 
    } 
    catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

}

public class AppendableObjectOutputStream extends ObjectOutputStream { 
    public AppendableObjectOutputStream(OutputStream out) throws IOException { 
    super(out); 
    } 

    @Override 
    protected void writeStreamHeader() throws IOException {} 

}

+0

ストリームヘッダーの書き込みをスキップするカスタム出力ストリームを使用しています。しかし、ストリームヘッダの読み込みをスキップするカスタム入力ストリームは使用していません。 –

+0

@JBNizet番号ストリームヘッダーは、追加時にスキップされます。入力側はそれについて知る必要はありません。ストリーム全体を、追加せずに書かれているかのように見ています。 – EJP

+0

@ Zabuza質問はObjectOutputStreamsについてです。 NIOには同等のものはなく、この無関係なトピックを紹介する理由はありません。質問をお読みください。 – EJP

答えて

0

ファイルが既にそれのデータとが存在する場合にのみ、追加のObjectOutputStreamを使用する必要があります。ファイルが新しい場合は、オブジェクトストリームヘッダーが必要です。

+0

ファイルが既に存在するかどうかを確認するための変更を加えました。ファイルの内容をクリアしてファイルに継続的に追加しているわけではない方法はありますか?たとえば、プログラムを実行するたびに、「vanilla、chocolate、strawberry」がファイルに追加されます。 –

+0

Eh?追加したくない場合は、**追加しないでください。 ** – EJP

関連する問題