ObjectOutputStream,readObject 只从序列化文件中读取第一个对象
ObjectOutputStream, readObject only reads first object from serialized file
我有一个对象的 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);
}
我剩下的class是
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();
}
}
好的,所以每次新学生进来时你都会存储整个学生列表,所以基本上你的文件保存的是:
- 列出一名学生
- 包括第一个学生在内的两名学生名单
- 3 名学生名单
- 等等等等。
我知道你可能认为它只会以增量方式写新学生,但你错了
.
您应该先将要存储的所有学生添加到列表中。然后将完整列表存储到文件中,就像您正在做的那样。
现在,当您从 filre 阅读时,首先 readObject
将 return 您排在第 1 位 - 这就是为什么您得到的列表只有一个学生。第二次阅读会给你 list no.2 等等。
因此,您必须保存数据:
- 创建包含 N 个学生的完整列表并将其存储到文件中
- 不使用列表,而是直接将学生存储到文件中
回读:
readObject
一次,所以你会得到List<Students>
- 通过多次调用
readObject
从文件中逐一读取学生
这是因为我认为 ObjectOutputStream 将 return 文件中的第一个对象。
如果你想要所有的对象,你可以使用 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());
}
我有一个对象的 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);
}
我剩下的class是
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();
}
}
好的,所以每次新学生进来时你都会存储整个学生列表,所以基本上你的文件保存的是:
- 列出一名学生
- 包括第一个学生在内的两名学生名单
- 3 名学生名单
- 等等等等。
我知道你可能认为它只会以增量方式写新学生,但你错了 .
您应该先将要存储的所有学生添加到列表中。然后将完整列表存储到文件中,就像您正在做的那样。
现在,当您从 filre 阅读时,首先 readObject
将 return 您排在第 1 位 - 这就是为什么您得到的列表只有一个学生。第二次阅读会给你 list no.2 等等。
因此,您必须保存数据:
- 创建包含 N 个学生的完整列表并将其存储到文件中
- 不使用列表,而是直接将学生存储到文件中
回读:
readObject
一次,所以你会得到List<Students>
- 通过多次调用
readObject
从文件中逐一读取学生
这是因为我认为 ObjectOutputStream 将 return 文件中的第一个对象。 如果你想要所有的对象,你可以使用 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());
}