-1

「シリアライゼーション」の章の最後の演習で与えられたプログラムを試していました。

このプログラムでは、クラスである型 Name と Address の 2 つのデータ メンバーのみをカプセル化するクラス Person を宣言する必要があります。次に、キーボードから一連の名前とアドレスを取得し、オブジェクトを作成してファイルに書き込む必要があります。ただし、FILE ALREADY EXISTS の場合、オブジェクトは既存のファイルに追加する必要があります。私のプログラムは初めて完全に実行されますが、2 回目は、追加されたレコードを読み戻そうとすると、例外が発生します。

java.io.StreamCorruptedException: invalid type code: AC 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1374) 
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) 
at Trial.main(Trial.java:66) 

これについて少し調査したところ、StreamHeader は 1 回だけ書き込むことができ、追加すると破損することがわかりました。それを回避する方法は何ですか?
オブジェクト書き込みコードは次のとおりです。

try(ObjectOutputStream stream = new ObjectOutputStream(new BufferedOutputStream(Files.newOutputStream(filePath,WRITE,CREATE,APPEND)))) {
        for(int i = 0;i<name.length;i++) {
            Person aPerson = new Person(name[i],address[i]);
            System.out.println(aPerson);
            stream.writeObject(aPerson);
            stream.reset();
            aPerson = null;
        }
        System.out.println("Writing Complete");
4

2 に答える 2

0

はい、私は以前にこの問題を抱えていました...残念ながらそれは不可能です。

できることは、オブジェクトをリストに配置し、一度に完全なリストを永続化することです。リストはオブジェクトであるため、同じように簡単に永続化できます。コンテンツ全体をメモリに読み込む必要があるため、これはひどいことですが、私が知る限り、これが唯一の方法です。

もう1つのオプション(私がお勧めします)は、JSonのようなものを使用してデータをコミットすることです。GSonはこの目的のために非常にうまく機能します。次に、テキストファイルにコミットできるオブジェクトを単純にマーシャリングおよびアンマーシャリングできます。どちらの方向にも1行のコードが必要なため(JSon-stringにオブジェクト、またはその逆)、非常に簡単に実行できます。

于 2012-05-29T12:10:32.527 に答える
0

これは機能します。したがって、プログラムをデバッグして、そうでない理由を確認してください。たぶん電話しないreset()

public class ClassTest {

    public static void main(String a[]) throws Exception {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("c:/temp/foo.txt"));
        oos.writeObject(new Test("foo", "bar"));
        oos.writeObject(new Test("baz", "brr"));
        oos.close();

        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("c:/temp/foo.txt"));
        System.out.println(ois.readObject());
        System.out.println(ois.readObject());
        ois.close();
    }
}

class Test implements Serializable {
    private String fld1;
    private String fld2;
    public Test(String v1, String v2) {
        this.fld1 = v1;
        this.fld2 = v2;
    }

    @Override
    public String toString() {
        return "Test [fld1=" + fld1 + ", fld2=" + fld2 + "]";
    }
}
于 2012-05-29T12:20:13.333 に答える