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(); 
     } 
    } 
} 

И вот мой метод ввода:

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); 
} 

Извините, если это немного сбивает с толку меня есть 3 файлов, чтобы сохранить 3 различных объектов, если есть это способ сохранить его в один файл, дайте мне знать, но я просто получал много ошибок, которые я не мог понять, как решить, так что это то, что я закончил делать. Спасибо за любую помощь.

Для 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. Вы вызываете его и выбрасываете результат, если он не является нулевым, а затем вызывает его снова. Второй вызов будет throw EOFException, если в файле нет другого объекта. Это не даст вам тот же результат, что и первый звонок. Это поток.

  3. in.available() также не является допустимым испытанием для конца потока. Это не то, для чего. См. Javadoc. Опять же, правильная техника с readObject() - это перехват EOFException.

+0

Я добавил блок try/catch, но каждый раз, когда я запускаю, я просто получаю исключение даже с данными на карте, когда я писал это в файл. – Brent

+0

Я дал вам около шести вещей, чтобы исправить, а не просто попробовать/поймать блоки. Вам нужно адресовать их * всем. * Новый код в вашем редактировании не показывает никаких признаков этого. – EJP

Смежные вопросы