从文件中重复写入和加载对象的 ArrayList

Posted

技术标签:

【中文标题】从文件中重复写入和加载对象的 ArrayList【英文标题】:Repeated Writing and Loading ArrayList of objects from a file 【发布时间】: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 的内容? 【参考方案1】:
new FileOutputStream("C:\\data.ser", true)

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

传递 false 而不是 true。

【讨论】:

没有。 ObjectOutputStream 不附加任何内容。 FileOutputStream 可以。 OP不写人。他写 List。所以文件最终包含两个序列化的 List。一个包含 5 个元素,另一个包含 10 个元素。

以上是关于从文件中重复写入和加载对象的 ArrayList的主要内容,如果未能解决你的问题,请参考以下文章

使用 jsonpickle 从文件中保存和加载对象

将 InputStream 写入文件 [重复]

如何将 json 输出保存在 String 对象中。重复数据写入所有拆分的文件中?

如何写入新的文件对象[重复]

网络中的对象写入

对象写入文件和从文件中重构到对象