5

次のようにwriteStreamHeader()をオーバーライドするAppendObjectOutputStreamクラス(ObjectOutputStream!)があるとします。

@Override
public void writeStreamHeader() throws IOException
{
    reset();
}

また、複数のオブジェクトをファイルに保存することを計画しているとしましょう。プログラムが実行されるたびに1つのオブジェクト。最初の実行でも、AppendObjectOutputStream()を使用しますか?

4

2 に答える 2

13

通常のObjectOutputStreamを使用して最初にストリームヘッダーを作成する必要があります。そうしないと、ObjectInputStreamを使用してファイルを開くときにjava.io.StreamCorruptedExceptionが発生します。

public class Test1 implements Serializable {

    public static void main(String[] args) throws Exception {
        ObjectOutputStream os1 = new ObjectOutputStream(new FileOutputStream("test"));
        os1.writeObject(new Test1());
        os1.close();

        ObjectOutputStream os2 = new ObjectOutputStream(new FileOutputStream("test", true)) {
            protected void writeStreamHeader() throws IOException {
                reset();
            }
        };

        os2.writeObject(new Test1());
        os2.close();

        ObjectInputStream is = new ObjectInputStream(new FileInputStream("test"));
        System.out.println(is.readObject());
        System.out.println(is.readObject());
于 2013-03-25T05:12:41.497 に答える
0

上記は私には機能しませんでした。具体的には、reset()は機能しませんでした。私はここで次を見つけました: https ://coderanch.com/t/583191/java/ObjectOutputStream-appending-file-overiding-ObjectOutputStream

@Override 
protected void writeStreamHeader() throws IOException {  
   // TODO Auto-generated method stub  
   System.out.println("I am called");  
   super.writeStreamHeader();
}  

これは私のために働いた。私はそれが直感に反しているように見えることを知っています、そして最初はスーパークラスメソッドを呼び出すことは何もすべきではないように見えますが、それはそうです。元の投稿を読んで試してみてください。

于 2021-02-09T15:13:27.933 に答える