【问题标题】:Writing and Reading to/from a file Objects stored in ArrayList写入和读取存储在 ArrayList 中的文件对象
【发布时间】:2017-04-25 09:21:20
【问题描述】:

这是一个简单的示例,我尝试将存储在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();
}}

【问题讨论】:

  • 请显示Person
  • 您正在将完整的 ArrayList 写入文件,因此 readObject 将返回 ArrayList 而不是 Person。
  • @cricket_007 我刚刚添加了我的“人”类
  • 请同时包含运行程序的主方法或单独的测试类,而不仅仅是脱离上下文的代码sn-p
  • 尝试使用persons = (ArrayList&lt;Person&gt;) ois.readObject(); 而不是Person result = (Person) ois.readObject(); persons.add(result);

标签: java file serialization arraylist writing


【解决方案1】:

给你...请注意以下几点:

是的,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 + "]";
    }
}

【讨论】:

  • "但是你需要先使用 .ser 而不是 .dat" - 从技术上讲,只要你保存和加载同一个文件,文件扩展名并不重要; .ser 只是一个常见的约定。
  • 谢谢 Bradley D。我发现一件事让我每次尝试都会崩溃。它缺少变量:Person(Serializable 类)中的“private static final long serialVersionUID = 1L”。
  • 究竟为什么应该使用像 Eclipse 这样的 IDE
  • @BradleyD 您的代码仍然无法正常工作。场景:将 5 人保存到 ArrayList -> 加载 5 人 -> 关闭应用程序 -> 将要保存的人数更改为 10 人 -> 保存 10 人 -> 在此之后,应用程序仍然只从文件中读取 5 人。怎么了?
  • 我猜你在代码之前没有阅读我的笔记。说代码不能正常工作而不给出任何指示你得到的错误不是你在这个网站上寻求帮助的方式。做我上面建议的事情。然后粘贴您的错误消息/堆栈跟踪
猜你喜欢
  • 2017-08-13
  • 1970-01-01
  • 1970-01-01
  • 2015-07-15
  • 1970-01-01
  • 1970-01-01
  • 2013-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多