通过ObjectInputStream读取对象会抛出EOF异常

问题描述:

我想通过ObjectInputStream读取对象。不过我检索以下堆栈跟踪与EOFException通过ObjectInputStream读取对象会抛出EOF异常

java.io.EOFException 
at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2325) 
at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2794) 
at 
java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:801) 
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:299) 
at student.operations.StudentOperations.addStudentDetails(StudentOperations.java:46) 
at student. 

我的代码如下:

FileInputStream fi = new  FileInputStream(file.getPath()); 
ObjIn = new ObjectInputStream(fi); 

FileOutputStream fo = new FileOutputStream(file.getPath()); 
Objout = new ObjectOutputStream(fo); 

//bo = new BufferedOutputStream(Objout); 
//bi = new BufferedInputStream(ObjIn); 

System.out.println("Enter the number of students to add"); 

number = in.nextInt(); 

System.out.println("Enter Student roll number:"); 
int rollno = in.nextInt(); 

try { 
    HashMap<Integer, StudentModel> hs = (HashMap<Integer, StudentModel>) ObjIn 
      .readObject(); 

    if (hs.containsKey(rollno)) { 
     System.out.println("Duplicate values are not allowed "); 
    } else { 

     for (counter = 0; counter < number; counter++) { 

      System.out.println("Enter Student name:"); 
      String name = in.next(); 

      System.out.println("Enter Student's Father name:"); 
      String fname = in.next(); 

      System.out.println("Enter Gender:"); 
      String gender = in.next(); 

      System.out.println("Enter Date of birth:"); 
      String date = in.next(); 

      SimpleDateFormat dateFormat = new SimpleDateFormat(
        "dd-MM-yyyy"); 
      Date dateObj = null; 

      try { 
       dateObj = dateFormat.parse(date); 
      } catch (ParseException e) { 
       System.out.println(e); 
      } 

      Calendar birthday = Calendar.getInstance(); 

      birthday.setTimeInMillis(dateObj.getTime()); 

      Calendar current = Calendar.getInstance(); 

      long currentTime = System.currentTimeMillis(); 

      current.setTimeInMillis(currentTime); 

      int age = current.get(Calendar.YEAR) 
        - birthday.get(Calendar.YEAR); 

      System.out.println("Enter the AddressLine1:"); 
      String address1 = in.next(); 
      in.nextLine(); 

      System.out.println("Enter the AddressLine2:"); 
      String address2 = in.next(); 
      in.nextLine(); 

      System.out.println("Enter the city"); 
      String city = in.next(); 
      in.nextLine(); 

      System.out.println("Enter the state"); 
      String state = in.next(); 
      in.nextLine(); 

      System.out.println("Enter the country:"); 
      String country = in.next(); 
      in.nextLine(); 

      System.out.println("Enter the Zipcode"); 
      int code = in.nextInt(); 
      in.nextLine(); 

      StudentUtill.student.put(rollno, new StudentModel(name, 
        fname, rollno, age, gender, dateObj, address1, 
        address2, city, state, country, code)); 

      Objout.writeObject(StudentUtill.student.toString()); 


      Objout.flush(); 

     }// for loop ends here 

tester.StudentTester.main(StudentTester.java:30)

+1

这是哪一行? 'StudentOperations.java:46' –

+0

如果你得到一个EOF很可能你没有正确的序列化你的HashMap – ControlAltDel

  • 你试图从空文件读取对象。看看堆栈跟踪。尝试读取标题的文件结尾。文件中甚至没有标题,更不用说对象了。它是空的。

  • 不要创建FileOutputStream,直到您有东西写入它,并且不要忘记在之后立即关闭它。

  • 在将文件写入文件之前,您还不正确地将地图转换为String,但尚未达到出现问题的程度。

+0

你能否请你解释一下如何以有效的方式执行对象序列化。 –

+0

@TheRed如果你有一个新的问题,你应该问它作为一个新的问题。没有人会在这里看到它。我没有,两年。 – EJP