2016-04-22 64 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(); 
}