2016-04-22 68 views
1

我想從文件(類的相同對象)讀取對象,使用Serializable,但是當它讀取所有對象時,它會給我提供錯誤IOException,java.io.ObjectInputStream$BlockDataInputStream.peekByte如何從文件中讀取多個相同的對象

我正在閱讀對象,然後保存到列表中。但是,當它達到可以說EOF它會引發錯誤。

這裏是我的方法:

private static void updateBook(String name) { 
    // TODO Auto-generated method stub 
    FileInputStream fis = null; 
    ObjectInputStream in = null; 
    Object obj = new Object(); 
    List<Object> libb = new ArrayList<Object>(); 
    File file = new File(name + ".ser"); 
    if (file.exists()) { 
     try { 
      fis = new FileInputStream(file); 
      in = new ObjectInputStream(fis); 
      try { 
       while (true) { 

        obj = in.readObject(); 
        libb.add(obj); 
       } 
      } catch (OptionalDataException e) { 
       if (!e.eof) throw e; 
       //JOptionPane.showMessageDialog(null, "Done!"); 
      } finally { 
       in.close(); 
       //fis.close(); 
      } 

      for(int j = 0; j < libb.size(); ++j) { 
       Book li = new Book(); 

       li = (Book) libb.get(j); 
       System.out.println(li.getBookName()); 
      } 
      // 

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

     } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
     } 
    } else { 
     System.out.println("\nThe file does not Exist!"); 
    } 
} 

誰能告訴我如何避免while(true)此錯誤。

完全錯誤:

java.io.EOFException 
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source) 
at java.io.ObjectInputStream.readObject0(Unknown Source) 
at java.io.ObjectInputStream.readObject(Unknown Source) 
+0

的可能的複製[什麼是從Java中的文件完全讀取對象流的最佳方式是什麼?(HTTP: //stackoverflow.com/questions/5046033/what-is-the-best-way-to-fully-read-a-stream-of-objects-from-a-file-in-java) – aribeiro

+0

@aribeiro它的不同,因爲我終於有條款,並且仍然收到EOF錯誤。 – Erjan

+0

確實如此,但您沒有'EOFException'的捕獲。 – aribeiro

回答

0

你應該增加:

catch (EOFException e){ 
    // do stuffs 
} 

EOFException沒有被抓到。

+0

'break不能在循環外使用' – Erjan

+0

是的 - 沒有意識到while循環的位置 – mani

1

在您try聲明你缺少了EOFException的catch子句:

try { 
    while (true) { 

     obj = in.readObject(); 
     libb.add(obj); 
    } 
} catch (OptionalDataException e) { 
    if (!e.eof) throw e; 
    //JOptionPane.showMessageDialog(null, "Done!"); 
} catch (EOFException eofe) { 
    // treat it as you like 
} finally { 
    in.close(); 
    //fis.close(); 
}