java - 向文件写入和读取存储在 ArrayList 中的对象

标签 java file arraylist serialization

这是一个简单的示例,我尝试在文件中写入和读取存储在 ArrayList 中的对象。

正在写入文件。读取文件仅适用于我的 ArrayList 中的第一个对象。我应该如何将其变成循环?

我尝试过类似的东西:

`while(ois !=null) {
    Person result = (Person) ois.readObject();
    persons.add(result);
}

但它不起作用。

这是完整的测试代码:

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

public static void savePersons() throws IOException{
     FileOutputStream fout = null;
     ObjectOutputStream oos = null;

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

     try{
         fout = new FileOutputStream("C:\\data.dat", 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");

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

public static void loadPersons() throws IOException{
    FileInputStream fis = null;
    ObjectInputStream ois = null;

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

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

        Person result = (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");

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

人员类别:

public class Person implements Serializable {
private String name;
private String surname;
private String mail;
private String telephone;
Person person;

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

主类:

public class Test {

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

最佳答案

给您...请注意以下事项:

是的,Chetan Jadhav CD 的建议有效。乙 使用 Eclipse 等 IDE 来帮助您调试代码,让您的生活更轻松。 清楚你的错误是什么(显示堆栈跟踪等。)注意对打印的 catch 子句的修改:

System.out.println("Saving ERROR: " + ex.getMessage()); 

在寻求帮助之前,请将所有代码放入一个文件中,以使每个人的生活更轻松。 通过使用索引对每个“人”进行编号,使每个“人”至少是唯一的。使用 .ser 作为可序列化文件,而不是 .dat

import java.util.List;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;

public class Data {
    private static final String SER_FILE = "C:\\view\\data.ser";
    static List<Person> persons = new ArrayList<Person>();

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

    public static void savePersons() throws IOException {

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

        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(SER_FILE, true));) {

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

    public static void loadPersons() throws IOException {

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

        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(SER_FILE));){

            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");

            persons.stream().forEach(System.out::println);

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

        }
    }
}

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

    @Override
    public String toString() {
        return "Person [name=" + name + ", surname=" + surname + ", mail=" + mail + ", telephone=" + telephone + "]";
    }
}

关于java - 向文件写入和读取存储在 ArrayList 中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41068171/

相关文章:

Java:埃拉托斯特尼筛法:数组作为参数

java - 在获取应用程序数据使用时满足运行 Jelly bean 以及 Jelly bean 之后版本的设备

windows - Powershell:始终生成空文件(比较对象的输出)

java - 将txt文件读入二维数组强制退出

java - ArrayList 编译错误

portability - 如何将 JRE 与 Launch4j 捆绑在一起?

java - 错误 :(26, 13) 无法解析 : com. google.firebase :firebase-database:11. 2.2

c - 从文件中读取链表并加载数据

Java - 从类中调用私有(private)数组列表

java - 如何使用 java 中数组中的值更新 JTable