追加序列化

Appending in Serialization

到目前为止,我发现有一种方法可以通过制作一个子 class 来在序列化中追加,但这似乎是一个漫长的过程。有没有更好的方法在序列化中追加?

我在名为 Course

的 class 中有这个 vectorlist

private Vector<Student> StudentList = new Vector<>();

我有 2 个 课程 的对象。 3 名学生注册了 1 门课程,2 名学生注册了另一门课程。现在我调用这个在文件中进行序列化的方法,但是当我用我的第二个课程对象调用它时,它会替换以前的内容。

public void Serialization() {
        try {
            File file = new File("EnrolledStudentsSerial.txt");
            if(!file.exists()){
               file.createNewFile();
            }
            FileOutputStream fo = new FileOutputStream(file);
            ObjectOutputStream output = new ObjectOutputStream(fo);
            output.writeObject("Course: " + this.name + "\n\nEnrolled Students: ");
            for (int i = 0; i < StudentList.size(); i++) {
                Student p_obj = StudentList.elementAt(i);
                String content = "\n\tStudent Name: " + p_obj.getName() + "\n\tStudent Department: " + p_obj.getDepartment() + "\n\tStudent Age: " + p_obj.getAge() + "\n";
                output.writeObject(content);
            }
            output.writeObject("\n");
            fo.close();
        } catch (IOException ioe){
            System.out.println("Error: " + ioe.getMessage()); 
        }
    }

如果你想追加到一个文件,而不是替换内容,你需要告诉FileOutputStream that, by adding an extra argument and call FileOutputStream(File file, boolean append)仅供参考:不要使用 ObjectOutputStream.

您不需要调用 createNewFile(),因为 FileOutputStream 会这样做,无论是否追加。

但是,您实际上并没有序列化对象,因为您序列化的是字符串。你在做什么没有意义。由于您似乎希望结果是一个文本文件(您正在编写文本,文件是名称 .txt),因此您应该忘记 ObjectOutputStream, and use a FileWriter

更好的是,不要使用旧文件 I/O API,您应该使用 Java 中添加的“更新的”NIO.2 API 7. 您还应该使用 try-with-resources。 Java 1.2.

中的古代 Vector class, which was replaced by ArrayList 也是如此

Java 命名约定是字段和方法名称以小写字母开头。既然你的方法不再是“序列化”,你应该给它一个更好的名字。

应用所有这些,您的代码应该是:

import static java.nio.file.StandardOpenOption.APPEND;
import static java.nio.file.StandardOpenOption.CREATE;
import static java.nio.file.StandardOpenOption.WRITE;

import java.io.BufferedWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
private ArrayList<Student> studentList = new ArrayList<>();
public void writeToFile() {
    Path file = Paths.get("EnrolledStudentsSerial.txt");
    try (BufferedWriter output = Files.newBufferedWriter(file, CREATE, APPEND, WRITE)) {
        output.write("Course: " + this.name + "\n\nEnrolled Students: ");
        for (Student student : studentList) {
            String content = "\n\tStudent Name: " + student.getName() +
                             "\n\tStudent Department: " + student.getDepartment() +
                             "\n\tStudent Age: " + student.getAge() + "\n";
            output.write(content);
        }
        output.write("\n");
    } catch (IOException ioe){
        System.out.println("Error: " + ioe.getMessage()); 
    }
}