Java 在序列化中追加

Java 在序列化中追加,java,serialization,netbeans,objectoutputstream,Java,Serialization,Netbeans,Objectoutputstream,到目前为止,我发现有一种方法可以通过生成子类来进行序列化中的追加,但这似乎是一种冗长的方法。有没有更好的方法在序列化中进行追加 我在一个名为Course的类中有一个向量列表 private Vector StudentList=new Vector() 我当然有两个目标。 一门课程招收3名学生,另一门课程招收2名学生。现在我调用这个方法,它在文件中进行序列化,但是当我用第二个课程对象调用它时,它会替换以前的内容 public void Serialization() { try

到目前为止,我发现有一种方法可以通过生成子类来进行序列化中的追加,但这似乎是一种冗长的方法。有没有更好的方法在序列化中进行追加

我在一个名为Course的类中有一个向量列表

private Vector StudentList=new Vector()

我当然有两个目标。 一门课程招收3名学生,另一门课程招收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()); 
        }
    }
public void序列化(){
试一试{
File File=新文件(“EnrolledStudentsSerial.txt”);
如果(!file.exists()){
createNewFile();
}
FileOutputStream fo=新的FileOutputStream(文件);
ObjectOutputStream输出=新的ObjectOutputStream(fo);
output.writeObject(“课程:+this.name+”\n\n学生:);
对于(int i=0;i
如果要附加到文件,而不是替换内容,则需要通过添加额外的参数和调用来告知。仅供参考:不要对
ObjectOutputStream
执行此操作

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

但是,实际上并不是序列化对象,而是序列化字符串。你这样做毫无意义。因为您似乎希望结果是一个文本文件(您正在编写文本,文件名为names
.txt
),所以您应该忘记它,而改用一个

更好的是,您应该使用Java7中添加的“更新的”NIO.2API,而不是使用旧的文件I/OAPI。您还应该使用try-with-resources。古代类也是如此,在Java1.2中被替换为

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

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

导入静态java.nio.file.StandardOpenOption.APPEND;
导入静态java.nio.file.StandardOpenOption.CREATE;
导入静态java.nio.file.StandardOpenOption.WRITE;
导入java.io.BufferedWriter;
导入java.io.IOException;
导入java.nio.file.Files;
导入java.nio.file.Path;
导入java.nio.file.path;
导入java.util.ArrayList;
private ArrayList studentList=new ArrayList();
public void writeToFile(){
Path file=Path.get(“EnrolledStudentsSerial.txt”);
try(BufferedWriter输出=Files.newBufferedWriter(文件、创建、附加、写入)){
output.write(“课程:+this.name+”\n\n学生:);
用于(学生:学生名单){
String content=“\n\t学生姓名:”+student.getName()+
“\n\t学生系:”+student.getDepartment()+
“\n\t学生年龄:”+student.getAge()+“\n”;
输出。写入(内容);
}
输出。写入(“\n”);
}捕获(ioe异常ioe){
System.out.println(“错误:+ioe.getMessage());
}
}

如果要附加到文件,而不是替换内容,则需要通过添加额外的参数和调用来告知。仅供参考:不要对
ObjectOutputStream
执行此操作

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

但是,实际上并不是序列化对象,而是序列化字符串。你这样做毫无意义。因为您似乎希望结果是一个文本文件(您正在编写文本,文件名为names
.txt
),所以您应该忘记它,而改用一个

更好的是,您应该使用Java7中添加的“更新的”NIO.2API,而不是使用旧的文件I/OAPI。您还应该使用try-with-resources。古代类也是如此,在Java1.2中被替换为

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

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

导入静态java.nio.file.StandardOpenOption.APPEND;
导入静态java.nio.file.StandardOpenOption.CREATE;
导入静态java.nio.file.StandardOpenOption.WRITE;
导入java.io.BufferedWriter;
导入java.io.IOException;
导入java.nio.file.Files;
导入java.nio.file.Path;
导入java.nio.file.path;
导入java.util.ArrayList;
private ArrayList studentList=new ArrayList();
public void writeToFile(){
Path file=Path.get(“EnrolledStudentsSerial.txt”);
try(BufferedWriter输出=Files.newBufferedWriter(文件、创建、附加、写入)){
output.write(“课程:+this.name+”\n\n学生:);
用于(学生:学生名单){
String content=“\n\t学生姓名:”+student.getName()+
“\n\t学生系:”+student.getDepartment()+
“\n\t学生年龄:”+student.getAge()+“\n”;
输出。写入(内容);
}
输出。写入(“\n”);
}捕获(ioe异常ioe){
System.out.println(“错误:+ioe.getMessage());
}
}

事实上,我对Java非常陌生,我这么做是为了完成我的大学作业,所以