2016-12-10 14 views
2

名前、姓などのデータが格納されたPersonクラスがあります。オブジェクトタイプPersonを作成し、ArrayListに追加して、このArrayListをファイルに保存します。次に、このファイルArrayListからロードしています。私は5人です。問題は、私が再び例10のオブジェクトPersonのために保存したいときです。私がファイルからArrayListをロードするとき、私は最初の書き込みからわずか5人しかいません。私はこれを繰り返しても、最初にこのファイルに書き込んだときにデータをロードします。どのように私はこれを修正することができます?ファイルからオブジェクトのArrayListを繰り返し書き込む

public class Data { 
static List<Person> persons = new ArrayList<Person>(); 

public static void main(String[] args) throws IOException { 
    Data.savePersons(5); 
    Data.loadPersons(); 

    /** Clean 'persons' array for TEST of load data */ 
    persons.removeAll(persons); 

    System.out.println("\n-----------\nNext Round\n-----------\n"); 

    Data.savePersons(10); 
    Data.loadPersons(); 
} 

/** Save a couple of Person Object to file C:/data.ser */ 
public static void savePersons(int noOfPersonToSave) throws IOException { 
    FileOutputStream fout = null; 
    ObjectOutputStream oos = null; 

    /** Make 5 'Person' object and add them to ArrayList 'persons' for example */ 
    for (int i = 0; i < noOfPersonToSave; i++) { 
     Person personTest = new Person("name" + i, "surname" + i, "email" +i, "1234567890" +i); 
     persons.add(personTest); 
    } 

    try { 
     fout = new FileOutputStream("C:\\data.ser", true); 
     oos = new ObjectOutputStream(fout); 
     oos.writeObject(persons); 

     System.out.println("Saving '" + persons.size() + "' Object to Array"); 
     System.out.println("persons.size() = " + persons.size()); 
     System.out.println("savePersons() = OK"); 

    } catch (Exception ex) { 
     System.out.println("Saving ERROR: " + ex.getMessage()); 

    } finally { 
     if (oos != null) { 
      oos.close(); 
     } 
    } 
} 

/** Load previously saved a couple of Person Object in file C:/data.ser */ 
public static void loadPersons() throws IOException { 
    FileInputStream fis = null; 
    ObjectInputStream ois = null; 

    try { 
     fis = new FileInputStream("C:\\data.ser"); 
     ois = new ObjectInputStream(fis); 

     persons = (List<Person>) ois.readObject(); 
     //persons.add(result); 

     System.out.println("-------------------------"); 
     System.out.println("Loading '" + persons.size() + "' Object from Array"); 
     System.out.println("persons.size() = " + persons.size()); 
     System.out.println("loadPersons() = OK"); 

    } catch (Exception e) { 
     System.out.println("-------------------------"); 
     System.out.println("Loading ERROR: " + e.getMessage()); 

    } finally { 
     if (ois != null) { 
      ois.close(); 
     } 
    } 
}} 

class Person implements Serializable { 

private static final long serialVersionUID = 1L; 
private String name; 
private String surname; 
private String mail; 
private String telephone; 

public Person(String n, String s, String m, String t) { 
    name = n; 
    surname = s; 
    mail = m; 
    telephone = t; 
} 

public String getName() { 
    return name; 
} 

public String getSurname() { 
    return surname; 
} 

public String getMail() { 
    return mail; 
} 

public String getTelephone() { 
    return telephone; 
}} 
+0

ファイルエクスプローラで 'data.ser'の内容を確認しましたか? – ItamarG3

答えて

3
new FileOutputStream("C:\\data.ser", true) 

あなたはappendパラメータにtrueを渡しています。だからあなたはを追加しています。すでに5人のリストの後に、ファイルに10人のリストがあります。あなたは1つのリストしか読んでいないので、あなたが書いた最初のものを読んでいます。そこには5人の人がいます。

trueの代わりにfalseを渡します。

+0

いいえ、ObjectOutputStreamは何も追加しません。 FileOutputStreamはこれを行います。そしてOPは人を書きません。彼はリストを書いている。したがって、ファイルは2つのシリアライズされたList を含んでいます。 1つは5つの要素を含み、もう1つは10を含みます。 –

関連する問題