2014-01-25 4 views
0

내 프로그램을 내지도를 파일에 저장하는 기능에 문제가 있습니다. 여기에 나의지도와 arraylist를 쓰고 읽는 두 가지 방법이 있습니다. 여기 ObjectInputStream/OutputStream에 문제가있는 경우

내 읽기 방법 :

private void getData() throws IOException, ClassNotFoundException { 
    File f_Instructors = new File(PSLTrackerInfo.file + "instructors.brent"); 
    File f_Students = new File(PSLTrackerInfo.file + "students.brent"); 
    File f_Times = new File(PSLTrackerInfo.file + "times.brent"); 
    if (f_Instructors.exists()) { 
     try (ObjectInputStream in = new ObjectInputStream(new 
       BufferedInputStream(new FileInputStream(f_Instructors)))) { 
      //Add theList back in 
      if (in.readObject() != null) { 
       TreeMap<Instructor, Set<Student>> read = null; 
       while(in.available() > 0) { 
        read = (TreeMap<Instructor, Set<Student>>) 
          in.readObject(); 
       } 
       if (read != null) { 
        for (Instructor key : read.keySet()) { 
         System.out.println(key); 
         Set<Student> values = read.get(key); 
         PSLTrackerInfo.addInstructor(key, values); 
        } 
        System.out.println("Instructors Found! Reading..."); 
       } else { 
        System.out.println("No instructor data saved.1"); 
       } 
      } else { 
       System.out.println("No instructor data saved.2"); 
      } 
      in.close(); 
     } 
    } 
    //Add times back in 
    if (f_Times.exists()) { 
     try (ObjectInputStream in = new ObjectInputStream(new 
       BufferedInputStream(new FileInputStream(f_Times)))) { 
      if (in.readObject() != null) { 
       TreeMap<Student, ArrayList<Date>> readTimes = null; 
       while(in.available() > 0) { 
        readTimes = (TreeMap<Student, ArrayList<Date>>) in.readObject(); 
       } 
       if (readTimes != null) { 
        for (Student key : readTimes.keySet()) { 
         System.out.println(key); 
         ArrayList<Date> values = readTimes.get(key); 
         PSLTrackerInfo.addTimes(key, values); 
        } 
        System.out.println("Dates Found! Reading..."); 
       } else { 
        System.out.println("No dates saved."); 
       } 
      } else { 
       System.out.println("No dates saved."); 
      } 
      in.close(); 
     } 
    } 
    //Add newStudents back in 
    if (f_Students.exists()) { 
     try (ObjectInputStream in = new ObjectInputStream(new 
       BufferedInputStream(new FileInputStream(f_Students)))) { 
      if (in.readObject() != null) { 
       ArrayList<Student> readStudents = null; 
       while (in.available() > 0) { 
        readStudents = (ArrayList<Student>) in.readObject(); 

       } 
       if (readStudents != null) { 
        PSLTrackerInfo.setTheList(readStudents); 
       } 
       System.out.println("New students found! Reading..."); 
      } else { 
       System.out.println("No new students data saved."); 
      } 
      in.close(); 
     } 
    } 
} 

그리고 여기 내 쓰기 방법 : I, 3 다른 개체를 저장이 경우 3 개 파일이 조금 혼란 경우

private void saveData() { 
    System.out.println("Saving Data..."); 
    File f_Instructors = new File(PSLTrackerInfo.file + "instructors.brent"); 
    File f_Students = new File(PSLTrackerInfo.file + "students.brent"); 
    File f_Times = new File(PSLTrackerInfo.file + "times.brent"); 
    ObjectOutputStream out_Instructors = null; 
    ObjectOutputStream out_Students = null; 
    ObjectOutputStream out_Times = null; 
    try { 
     out_Instructors = new ObjectOutputStream(new 
       BufferedOutputStream(new FileOutputStream(f_Instructors))); 
     out_Students = new ObjectOutputStream(new 
       BufferedOutputStream(new FileOutputStream(f_Students))); 
     out_Times = new ObjectOutputStream(new 
       BufferedOutputStream(new FileOutputStream(f_Times))); 
     out_Instructors.writeObject(PSLTrackerInfo.getMap()); 
     out_Times.writeObject(PSLTrackerInfo.getTimes()); 
     out_Students.writeObject(PSLTrackerInfo.getList()); 
     out_Instructors.flush(); 
     out_Students.flush(); 
     out_Times.flush(); 
     out_Instructors.close(); 
     out_Students.close(); 
     out_Times.close(); 
    } catch (IOException ex) { 
     Logger.getLogger(PrivateLessonsTrackerGUI.class.getName()) 
       .log(Level.SEVERE, null, ex); 
    } 
    System.exit(0); 
} 

죄송합니다 그것을 하나의 파일에 저장하는 방법입니다.하지만 알려주지 만 해결 방법을 찾을 수 없다는 오류가 많아졌습니다. 주어진 도움에 감사드립니다.

는 EJP에 :이

TreeMap<Instructor, Set<Student>> read = null; 
try { 
    read = (TreeMap<Instructor, Set<Student>>) 
      in.readObject(); 
} catch (EOFException e) { 
    System.out.println("Caught EOFException!"); 
} 

그리고이 파일에 기록되었을 때의 데이터가 있었다하더라도, 내가 EOFException는 매번를 얻었다을 시도했다.

답변

0
  1. in.readObject()는 null을 작성하지 않는 한 null을 반환하지 않습니다. 스트림의 끝 테스트로 사용하는 경우 올바르지 않습니다. 정확한 기술은 EOFException을 잡는 것입니다.

  2. null이 아닌 경우 결과를 던져 버린 다음 다시 호출합니다. 두 번째 호출 이 파일에 다른 객체가 없으면 EOFException을 던집니다. 첫 번째 호출과 동일한 결과를 제공하지는 않습니다. 그것은 스트림입니다.

  3. in.available()은 스트림 끝 (end of stream)에 대한 유효한 테스트가 아닙니다. 그것은 그것이 무엇을위한 것이 아닙니다. Javadoc을 보라. 다시, readObject()를 사용하는 올바른 기술은 EOFException을 잡는 것입니다.

+0

필자는 try/catch 블록을 추가했지만 매번 실행할 때마다 맵에 데이터가있는 경우에도 파일에 기록 할 때 예외가 계속 발생합니다. – Brent

+0

블록을 잡으려고 시도하는 것뿐만 아니라 해결할 여섯 가지 사항을 알려주었습니다. * all을 처리해야합니다. * 편집중인 새 코드에는 부호가 표시되지 않습니다. – EJP