

シリアライズとデシリアライズをし、ファイルにオブジェクトの読み書きをしたいです。追加の書き込みはできるのですが、読み込みが上手くいきません。  
何度読み込んでも、ファイルに一番初めに書き込んだオブジェクトしか得ることが出来ません。

ファイルに書き込んだすべてのオブジェクトを読み込みたいです。

main関数でループを回すという方法を考え、RandomAccessFileを使いファイルポインタの動かしてというやり方をしていたのですが上手くいきませんでした。  
１行ずつ読み込むという方法もあったのですが、オブジェクトでは型が違いますとエラーになってしまいます。

もしうまい方法を知っている方がいればぜひ教えてください。  
よろしくお願い致します。

Member.javaファイル

[code]

    package hello;
    
    import java.io.Serializable;
    
    public class Member implements Serializable {
    
        public String name; // 氏名
        public int age;     // 年齢
    }
    
[/code]

SerializableSampleTest.javaファイル

[code]

    package hello;
    import java.io.FileInputStream;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    
    public class SerializableSampleTest {
        public static void main(String[] args) {
            SerializableSampleTest sst1 = new SerializableSampleTest();
            SerializableSampleTest sst2 = new SerializableSampleTest();
    
    
            // 一人目
            Member mb1 = new Member();
            mb1.name = "sakura";
            mb1.age = 20;
    
            List Akumi = new ArrayList();
            Akumi.add(mb1.name);
            Akumi.add(mb1.age);
    
            sst1.write(Akumi);
    
            // 二人目
            Member mb2 = new Member();
            mb2.name = "yuri";
            mb2.age = 19;
    
            List Bkumi = new ArrayList();
            Bkumi.add(mb2.name);
            Bkumi.add(mb2.age);
    
            sst2.write(Bkumi);
    
    
            System.out.println(sst1.read());
            System.out.println(sst2.read());
    
    
    
        }
    
     public void write(java.util.List<Member> Mem) {
         // シリアライズ
         try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("member", true))) {
             oos.writeObject(Mem);
             System.out.println("シリアライズ完了");
             oos.close();
    
         } catch (IOException e) {
             System.out.println("error");
         }
     }
    
     public java.util.List<Member> read(){
         java.util.List<Member> Mem = null;
    
         // デシリアライズ
         try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("member"))) {
             Mem = (List<Member>) ois.readObject();
             System.out.println("デシリアライズ完了");
             ois.close();
         } catch (IOException | ClassNotFoundException e) {
             System.out.println("error");
         }
         return Mem;
      }
    
     }
    
[/code]


CC BY-SA 3.0
2016-11-21T15:19:46.940
30581
2016-12-27T05:43:00.830
2016-11-21T15:21:43.383
5044
19654
question
java
ファイルに書き込んだオブジェクトを全て読み込みたいが、先頭にある１つ目しか読み込むことができない


こんな感じでしょうか。

[code]

    public class SerializableSampleTest {
      try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("member"))) {
        // 一人目
        Member mb1 = new Member();
        mb1.name = "sakura";
        mb1.age = 20;
        oos.writeObject(mb1);
    
        // 二人目
        Member mb2 = new Member();
        mb2.name = "yuri";
        mb2.age = 19;
        oos.writeObject(mb2);
    
        System.out.println("シリアライズ完了");
      } catch (IOException e) {
        System.out.println("error");
      }
    
      try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("member"))) {
        while (true) {
          Member mem = (Member) ois.readObject();
          System.out.println(mem);
        }
      } catch (EOFException e) {
        System.out.println("デシリアライズ完了");
      } catch (IOException | ClassNotFoundException e) {
        System.out.println("error");
      }
    }
    
[/code]

まず、`List`の使い方が間違っています。調べなおしてください。  
この場合`List`を使う必要はありません。

また、`ObjectOutputStream`は`AutoCloseable`なので、[try-with-resources
文](https://docs.oracle.com/javase/jp/7/technotes/guides/language/try-with-
resources.html)を使うならそのブロック内で`close()`する必要はありません。

また、二つのオブジェクトを`writeObject()`するのに、二つの`ObjectOutputStream`を開く必要はありません。  
`readObject()`も同様です。  
むしろ開かない方がいいです。

`readObject()`で全てのオブジェクトを読み切ったかの判定は、ラップしているのが`FileInputStream`なので、`EOFException`でできます。


CC BY-SA 3.0
2016-11-21T16:30:09.193
30582
2016-11-21T16:30:09.193
19437
30581
answer