追加序列化
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());
}
}
到目前为止,我发现有一种方法可以通过制作一个子 class 来在序列化中追加,但这似乎是一个漫长的过程。有没有更好的方法在序列化中追加?
我在名为 Course
的 class 中有这个 vectorlistprivate 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());
}
}