【问题标题】:Repeated Writing and Loading ArrayList of objects from a file从文件中重复写入和加载对象的 ArrayList
【发布时间】:2017-04-26 00:31:31
【问题描述】:

我有一个“Person”类,我在其中存储了姓名、姓氏等数据。我创建了 5 个对象类型 Person,将它们添加到 ArrayList,然后将此 ArrayList 保存到文件中。接下来我从这个文件 ArrayList 加载,我有 5 个人。问题是当我想再次保存例如 10 个对象人时。当我从文件中加载 ArrayList 时,我从第一次写作开始只有 5 个人。如果我重复这个,我将从第一次写入这个文件开始加载数据。我该如何解决这个问题?

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;
}}

【问题讨论】:

  • 您是否在某个文件资源管理器中检查过data.ser 的内容?

标签: java file arraylist load writefile


【解决方案1】:
new FileOutputStream("C:\\data.ser", true)

您将 true 传递给 append 参数。因此,在现有的 5 人列表之后,您要在文件中附加 10 人的列表。由于您只阅读了一个列表,因此您阅读了您写的第一个列表,其中包含 5 个人。

传递 false 而不是 true。

【讨论】:

  • 没有。 ObjectOutputStream 不附加任何内容。 FileOutputStream 可以。 OP不写人。他写 List。所以文件最终包含两个序列化的 List。一个包含 5 个元素,另一个包含 10 个元素。
猜你喜欢
  • 1970-01-01
  • 2013-09-04
  • 2017-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-13
  • 2013-08-15
  • 2017-04-25
相关资源
最近更新 更多