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

时间:2016-12-09 20:15:38

标签: java file serialization arraylist writing

这是一个简单的例子,我试图在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();
}}

1 个答案:

答案 0 :(得分:2)

请你注意以下几点:

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

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

在您寻求帮助之前,将所有代码放在一个文件中,以使每个人的生活更轻松。 让每个人“#39;至少有人通过使用索引编号来使用唯一的。使用.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 + "]";
    }
}