2016-12-10 2 views
2

У меня есть класс Person, в котором хранятся данные, такие как имя, фамилия и т. Д. Я делаю 5 объектов типа Person, добавляю их в ArrayList и сохраняю этот файл ArrayList в файл. Далее я загружаю из этого файла ArrayList и у меня 5 человек. Проблема в том, что я хочу сохранить снова, например, для объекта объекта 10. Когда я загружаю 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) 

Вы проходя true для параметра append. Итак, вы находитесь , добавив список из 10 человек в файл, после уже существующего списка из 5 человек. А поскольку вы читаете только один список, вы читаете первое, что вы написали, в котором содержится 5 человек.

Передача ложных вместо истинных.

+0

№ Объект ObjectOutputStream ничего не добавляет. FileOutputStream делает. И ОП не пишет людей. Он пишет список . Таким образом, файл заканчивается, содержащий два сериализованных списка . Один из них содержит 5 элементов, а второй - 10. –

Смежные вопросы