【问题标题】:best way to write series of objects to a .ser file using ObjectOutputStream and read them back使用 ObjectOutputStream 将一系列对象写入 .ser 文件并将它们读回的最佳方法
【发布时间】:2013-12-08 08:29:53
【问题描述】:

我从 Student Class 中创建一系列对象并将它们存储在向量中。创建后,我将每个对象写入 .ser 文件。然后我把它们读回来。我的代码运行良好。我想知道的是,我这样做的方式是正确的,还是有任何简单和优化的方法来完成这项工作?以及如何替换或删除 .ser 文件中的特定对象,而无需重新了解整个文件。

学生班

public class Student implements Comparable<Student>, Serializable{

    private String firstName = "";
    private int registrationNumber;
    private int coursework1;
    private int coursework2;
    private int finalExam;
    private double moduleMark;

    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public int getRegistrationNumber() {
        return registrationNumber;
    }
    public void setRegistrationNumber(int registrationNumber) {
        this.registrationNumber = registrationNumber;
    }
    public int getCoursework1() {
        return coursework1;
    }
    public void setCoursework1(int coursework1) {
        this.coursework1 = coursework1;
    }
    public int getCoursework2() {
        return coursework2;
    }
    public void setCoursework2(int coursework2) {
        this.coursework2 = coursework2;
    }
    public int getFinalExam() {
        return finalExam;
    }
    public void setFinalExam(int finalExam) {
        this.finalExam = finalExam;
    }
    public double getModuleMark() {
        return moduleMark;
    }
    public void setModuleMark(double moduleMark) {
        this.moduleMark = moduleMark;
    }
    public int compareTo(Student s){
        if (this.moduleMark > s.moduleMark)
            return 1;
        else if (this.moduleMark == s.moduleMark)
            return 0;
        else 
            return -1;
    }
} 

文件写入部分

public static void Write(Student mm){
        try
          {
            FileOutputStream fileOut = new FileOutputStream("info.ser",true);
            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(fileOut));

            out.writeObject(mm);            
            out.close();
            fileOut.close();
            System.out.println("Serialized data is saved in info.ser");
          }catch(IOException i)
          {
              //i.printStackTrace();
          }

    }

阅读部分

public static int Read() {
        int count=0;
        try{
            vector = new Vector<Student>();
            FileInputStream saveFile = new FileInputStream("info.ser");
            ObjectInputStream save;
            try{
                for(;;){
                    save = new ObjectInputStream(saveFile);
                    student = (Student) save.readObject();
                    vector.add(student);
                    count++;
                }
            }catch(EOFException e){
                //e.printStackTrace();
            }
            saveFile.close(); 

        }catch(Exception exc){
            exc.printStackTrace();
        }
        return count;
    }

【问题讨论】:

  • 此站点不适用于工作代码。您应该将此问题发布到 codereview.stackexchange.com。

标签: java vector fileinputstream fileoutputstream objectoutputstream


【解决方案1】:

如果不重写整个文件,就无法删除 Student 对象。原因是如果您尝试附加更多 Student 对象,则会损坏标头。因此,当您回读对象时,您将得到一个StreamCorruptedException

所以你将不得不读回对象,删除所需的对象,删除旧文件并写入一个新文件。

【讨论】:

  • 啊是这样..在这种地方使用序列化和反序列化方法是好还是坏??
  • 我没有看到将对象写入文件的问题。 Vector 本身是可序列化的,因此您可以在一个方法调用中将 Vector 写入文件。一个一个地写入对象会导致流被破坏
猜你喜欢
  • 1970-01-01
  • 2016-07-25
  • 2021-07-24
  • 2014-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多