68

複数のオブジェクトをファイルに書き込み、コードの別の部分でそれらを取得します。コードにエラーはありませんが、正しく動作していません。私のコードの何が問題なのかを教えてください。さまざまな Web サイトからさまざまなコードを読みましたが、どれもうまくいきませんでした。

オブジェクトをファイルに書き込むコードは次のとおりです。 MyClassList は、クラスのオブジェクトを含む配列リストです (ファイルに書き込む必要があります)。

for (int cnt = 0; cnt < MyClassList.size(); cnt++) {
    FileOutputStream fout = new FileOutputStream("G:\\address.ser", true);
    ObjectOutputStream oos = new ObjectOutputStream(fout);
    oos.writeObject(MyClassList.get(cnt));
}

各オブジェクトをファイルの最後に追加したいので、出力ストリームのコンストラクターに「true」を追加しました。あれは正しいですか?

ファイルからオブジェクトを読み取るコードは次のとおりです。

 try {
     streamIn = new FileInputStream("G:\\address.ser");
     ObjectInputStream objectinputstream = new ObjectInputStream(streamIn);
     MyClass readCase = (MyClass) objectinputstream.readObject();
     recordList.add(readCase);
     System.out.println(recordList.get(i));
 } catch (Exception e) {
     e.printStackTrace();
 }

最後に、オブジェクトを 1 つだけ出力します。今、私は正しく書いていないのか、正しく読んでいるのかわかりません!

4

5 に答える 5

86

リスト全体を一度にシリアライズしないのはなぜですか?

FileOutputStream fout = new FileOutputStream("G:\\address.ser");
ObjectOutputStream oos = new ObjectOutputStream(fout);
oos.writeObject(MyClassList);

もちろん、 MyClassList がArrayListor LinkedList、または別のSerializableコレクションであると仮定します。

それを読み返す場合、コードでは 1 つのアイテムのみを準備します。書き込まれたすべてのアイテムを収集するループはありません。

于 2013-06-25T09:47:31.020 に答える
54

他の人が示唆したように、リスト全体を一度にシリアライズおよびデシリアライズすることができます。これはより単純であり、意図したことに完全に準拠しているようです。

その場合、シリアル化コードは

ObjectOutputStream oos = null;
FileOutputStream fout = null;
try{
    fout = new FileOutputStream("G:\\address.ser", true);
    oos = new ObjectOutputStream(fout);
    oos.writeObject(myClassList);
} catch (Exception ex) {
    ex.printStackTrace();
} finally {
    if(oos != null){
        oos.close();
    } 
}

そして、デシリアライゼーションは次のようになります (myClassList がリストであり、ジェネリックを使用すると仮定すると):

ObjectInputStream objectinputstream = null;
try {
    FileInputStream streamIn = new FileInputStream("G:\\address.ser");
    objectinputstream = new ObjectInputStream(streamIn);
    List<MyClass> readCase = (List<MyClass>) objectinputstream.readObject();
    recordList.add(readCase);
    System.out.println(recordList.get(i));
} catch (Exception e) {
    e.printStackTrace();
} finally {
    if(objectinputstream != null){
        objectinputstream .close();
    } 
}

意図したように、ファイルからいくつかのオブジェクトを逆シリアル化することもできます。

ObjectInputStream objectinputstream = null;
try {
    streamIn = new FileInputStream("G:\\address.ser");
    objectinputstream = new ObjectInputStream(streamIn);
    MyClass readCase = null;
    do {
        readCase = (MyClass) objectinputstream.readObject();
        if(readCase != null){
            recordList.add(readCase);
        } 
    } while (readCase != null)        
    System.out.println(recordList.get(i));
} catch (Exception e) {
    e.printStackTrace();
} finally {
    if(objectinputstream != null){
        objectinputstream .close();
    } 
}

finally 句でストリーム オブジェクトを閉じることを忘れないでください (注: 例外がスローされる可能性があります)。

編集

コメントで示唆されているように、リソースで tryを使用することをお勧めします。コードは非常にシンプルになります。

リストのシリアル化は次のとおりです。

try(
    FileOutputStream fout = new FileOutputStream("G:\\address.ser", true);
    ObjectOutputStream oos = new ObjectOutputStream(fout);
){
    oos.writeObject(myClassList);
} catch (Exception ex) {
    ex.printStackTrace();
}
于 2013-06-25T12:15:43.630 に答える