2013-12-09 2 views
1

Почему я не могу создать объект ObjectInputStream? Каждый раз, когда я пытаюсь создать его, я получаю EOFException, и я не могу понять, почему. Кто-нибудь может мне помочь? Ниже приведен код, с которым у меня возникла проблема, и трассировка стека, полученная от выполнения. Файл пуст.Не удается создать ObjectInputStream

public void loadFromFileStudent() throws IOException, ClassNotFoundException { 
    try{ 
     InputStream inputStream = new FileInputStream("student.txt"); 
     System.out.println(inputStream.toString()); 
     ObjectInputStream objectInputStream; 
     objectInputStream = new ObjectInputStream(inputStream); 
     System.out.println(objectInputStream.toString()); 
     this.repo=(Dictionary<Integer, Student>) objectInputStream.readObject(); 

     objectInputStream.close(); 
     inputStream.close(); 
    }catch (EOFException e){ 
     e.printStackTrace();; 
     //System.out.println(e.getMessage()); 
    } 
} 

.

[email protected] 
java.io.EOFException 
    at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2324) 
    at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2793) 
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:799) 
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:299) 
    at repository.Repository.loadFromFileStudent(Repository.java:94) 
    at repository.Repository.<init>(Repository.java:112) 
    at utils.DataStructure.createRepository(DataStructure.java:16) 
    at controller.Controller.<init>(Controller.java:9) 
    at utils.DataStructure.createController(DataStructure.java:20) 
    at application.RunMenu.<init>(RunMenu.java:15) 
    at application.App.main(App.java:5) 
+1

Я бы просмотрел содержание «student.txt», не пуст? –

+0

Вы правильно сериализовались? разместите свой код для класса 'repo' и сериализации –

+0

На основе трассировки стека, показывающей, что EOFException исходит от конструктора ObjectInputStream, мне пришлось бы предположить, что файл 'student.txt' является сериализованным Java-объектом, который был сериализован неправильно. У вас есть код для сериализации? – claymore1977

ответ

0

EOFException выслан, когда достигнут конец файла. То есть вы прочитали весь файл. Поэтому вы не должны закрывать свои потоки в операторе try, но используйте try-with-resources, чтобы автоматически закрыть их.

попробовать что-то просто, как это:

public void loadFromFileStudent() throws IOException, ClassNotFoundException { 
    try (InputStream inputStream = new FileInputStream("student.txt"); 
     ObjectInputStream objectInputStream = new ObjectInputStream(inputStream)) { 
     this.repo = (Dictionary<Integer, Student>) objectInputStream.readObject(); 
    } catch (FileNotFoundException e) { 
     System.out.println ("File not found"); 
    } catch (IOException e) { 
     System.out.println ("Error while reading"); 
    } catch (ClassNotFoundException e) { 
     System.out.println ("No class"); 
    } catch (ClassCastException e) { 
     System.out.println ("Could not cast to class"); 
    } 
} 

написание столь же прост:

public void writeObject (Object o) { 
    try (FileOutputStream fos = new FileOutputStream (this.filename); 
     ObjectOutputStream oos = new ObjectOutputStream(fos)) { 
     oos.writeObject(o); 
     oos.flush(); 
    } catch (NotSerializableException e) { 
     System.out.println ("Object wont be serialized"); 
     e.printStackTrace(); 
    } catch (IOException e) { 
     System.out.println ("Error while writing to file"); 
     e.printStackTrace(); 
    } 
} 
+1

не имеет отношения к вопросу под рукой – radai

+0

Почему? Случай, когда выбрано EOFException, заключается в том, что достигнут конец файла. Исключение не генерируется при создании нового экземпляра objectinputstream ('readFully' /' readShort' его бросает). – DavidS

0

Из моего понимания вопроса я предполагаю, что OP делает некоторые вещи, как показано ниже, и которая должна работать корректно. Может быть, OP бы что-то пропустил во время написания/чтения. Надеюсь, это поможет выяснить.

public class Test2 { 
    public static void main(String[] args) { 
     Test2 t = new Test2(); 
     t.create(); 
     t.read(); 
    } 

    public void create(){ 
     try{ 
      ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("D:\\test\\ab.txt")); 
      Student st = new Student("chevs"); 
      Dictionary<Integer, Student> dict = new Hashtable<Integer, Student>(); 
      dict.put(1, st); 
      os.writeObject(dict); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
    public void read() 
    { 
     try{ 
      InputStream inputStream = new FileInputStream("D:\\test\\a.txt"); 
      System.out.println(inputStream.toString()); 
      ObjectInputStream objectInputStream; 
      objectInputStream = new ObjectInputStream(inputStream); 
      System.out.println(objectInputStream.toString()); 
      private Dictionary<Integer, Student> repo=(Dictionary<Integer, Student>) objectInputStream.readObject(); 
      System.out.println(repo.get(1)); 
      objectInputStream.close(); 
      inputStream.close(); 

     }catch (Exception e){ 
      e.printStackTrace();; 
     } 
    } 

    public class Student implements Serializable{ 
     public String name=null; 
      public Student(String name){ 
       this.name=name; 
      } 
     public String toString() { 
      return name.toString(); 
     } 
    } 

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