0

학생 클래스에서 일련의 객체를 만들어 벡터에 저장합니다. 일단 생성되면 .ser 파일에 각 객체를 씁니다. 그런 다음 다시 읽었습니다. 내 코드가 완벽하게 작동합니다. 내가 알고 싶은 것은, 내가하는 일이 옳다는 것인가 아니면 이것이 쉽고 최적화 된 방법일까요 ?? 또한 파일 전체를 다시 표시하지 않고 .ser 파일에서 특정 개체를 바꾸거나 삭제하는 방법도 있습니다.ObjectOutputStream을 사용하여 .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; 
    } 
+0

이 사이트는 작동 코드가 아닙니다. 대신이 질문을 codereview.stackexchange.com에 게시해야합니다. –

답변

1

는 전체 파일을 다시 작성하지 않고 학생 개체를 삭제하는 방법은 없습니다. 그 이유는 더 많은 Student 객체를 추가하려고하면 헤더가 손상 될 수 있기 때문입니다. 그러므로 당신이 물체를 다시 읽을 때 당신은 StreamCorruptedException을 얻을 것입니다.

개체를 다시 읽고 필요한 개체를 삭제하고 이전 파일을 삭제하고 새 개체를 작성해야합니다.

+0

아아 그렇게 .. 이런 종류의 장소에 대한 직렬화 및 비 직렬화 방법을 사용하는 것이 좋거나 나쁘다. ?? – Eclayaz

+1

개체를 파일에 쓰는 데 문제가 없습니다. Vector 자체는 Serializable이므로 하나의 메서드 호출로 Vector에 파일을 쓸 수 있습니다. 객체를 하나씩 쓰면 스트림이 손상됩니다. –