私はメモ柄のデザインパターンを利用したプログラムを持っており、各オブジェクトの状態をシリアライゼーションを使ってファイルに保存し、オブジェクトを元に戻したいと思っています。問題は、 "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 {}
}
ストリームヘッダーの書き込みをスキップするカスタム出力ストリームを使用しています。しかし、ストリームヘッダの読み込みをスキップするカスタム入力ストリームは使用していません。 –
@JBNizet番号ストリームヘッダーは、追加時にスキップされます。入力側はそれについて知る必要はありません。ストリーム全体を、追加せずに書かれているかのように見ています。 – EJP
@ Zabuza質問はObjectOutputStreamsについてです。 NIOには同等のものはなく、この無関係なトピックを紹介する理由はありません。質問をお読みください。 – EJP