ObjectOutputStream,readObject只从序列化文件中读取第一个对象

时间:2015-12-16 18:44:55

标签: java arraylist objectinputstream

我有一个对象的ArrayList,我想将它们存储到文件中,我也希望将它们从文件读取到ArrayList。我可以使用writeObject方法将它们成功写入文件,但是当从文件读取到ArrayList时,我只能读取第一个对象。这是我从序列化文件中读取的代码

 public void loadFromFile() throws IOException, ClassNotFoundException {
        FileInputStream fis = new FileInputStream(file);
        ObjectInputStream ois = new ObjectInputStream(fis);
        myStudentList = (ArrayList<Student>) ois.readObject();
}

编辑:

这是将列表写入文件的代码。

 public void saveToFile(ArrayList<Student> list) throws IOException {
        ObjectOutputStream out = null;
        if (!file.exists ()) out = new ObjectOutputStream (new FileOutputStream (file));
        else out = new AppendableObjectOutputStream (new FileOutputStream (file, true));
        out.writeObject(list);
}

我班上的其余部分是

public class Student implements Serializable {
    String name;
    String surname;
    int ID;
    public ArrayList<Student> myStudentList = new ArrayList<Student>();
    File file = new File("src/files/students.txt");


    public Student(String namex, String surnamex, int IDx) {
        this.name = namex;
        this.surname = surnamex;
        this.ID = IDx;
    }

    public Student(){}

    //Getters and Setters


    public void add() {

        Scanner input = new Scanner(System.in);


        System.out.println("name");
        String name = input.nextLine();
        System.out.println("surname");
        String surname = input.nextLine();
        System.out.println("ID");
        int ID = input.nextInt();
        Ogrenci studenttemp = new Ogrenci(name, surname, ID);
        myOgrenciList.add(studenttemp);
        try {
            saveToFile(myOgrenciList, true);
        }
        catch (IOException e){
            e.printStackTrace();
        }


    }

2 个答案:

答案 0 :(得分:0)

好的,所以每次新学生进来时你都会存储整个学生名单,所以基本上你的文件保存的是:

  1. 与一名学生一起列出
  2. 列出两名学生,包括第一名
  3. 3名学生名单
  4. 依此类推。
  5. 我知道你可能认为它会以渐进的方式只写新学生,但你错了

    您应该首先将要存储的所有学生添加到列表中。然后将完整列表存储到文件中,就像您正在执行此操作一样。

    现在,当您要阅读filre时,首先readObject将返回第1列表 - 这就是为什么您只能获得一个学生的列表。第二次阅读将给你第2号清单,依此类推。

    因此,您需要保存数据:

    1. 创建完整列表,包含N个学生,并将其存储在文件
    2. 之后
    3. 请勿使用列表,而是将学生直接存储到文件
    4. 要读回来:

      1. readObject一次,因此您将获得List<Students>
      2. 通过多次调用readObject
      3. ,逐个从文件中读取学生

答案 1 :(得分:0)

这是因为我认为ObjectOutputStream将返回文件中的第一个对象。 如果您需要所有对象,则可以使用for循环并像这样使用-:

    FileInputStream fis = new FileInputStream("OutObject.txt");

    for(int i=0;i<3;i++) {
        ObjectInputStream ois = new ObjectInputStream(fis);
        Employee emp2 = (Employee) ois.readObject();

        System.out.println("Name: " + emp2.getName());
        System.out.println("D.O.B.: " + emp2.getSirName());
        System.out.println("Department: " + emp2.getId());
    }