Java读取对象输入流到arraylist?

以下方法应该将二进制文件读入arrayList 。 但是得到一个java.io.EOFException

 at java.io.ObjectInputStream $ BlockDataInputStream.peekByte(ObjectInputStream.java:2553)
在java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1296)
 at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
 at ....阅读(Tester.java:400) 
 at .... main(Tester.java:23)

main的第23行调用方法,第400行是下面的while循环。 有任何想法吗?

 private static void Read() { try { ObjectInputStream objIn = new ObjectInputStream(new FileInputStream("/file.bin")); while (objIn.readObject() != null) { list.add((Libreria) objIn.readObject()); } objIn.close(); } catch(Exception e) { e.printStackTrace(); } } 

根据其他答案,你在循环中阅读两次。 你的另一个问题是空测试。 如果你写了一个null而不是EOS, readObject()只返回null,所以将它用作循环终止测试并没有多大意义。 readObject()循环的正确终止是

 catch (EOFException exc) { in.close(); break; } 

问题是你在循环中调用了两次readObject()。 试试这个:

 MediaLibrary obj = null; while ((obj = (MediaLibrary)objIn.readObject()) != null) { libraryFromDisk.add(obj); } 

你正在读测试中的一个对象:

 while (objIn.readObject() != null) 

然后你正在阅读下一个对象:

 libraryFromDisk.add((MediaLibrary) objIn.readObject()); 

因此,在一次迭代中,您应该只读取一个对象

 private static void Load() { try { ObjectInputStream objIn = new ObjectInputStream(new FileInputStream("/file.bin")); Object object = objIn.readObject(); while (object != null) { libraryFromDisk.add((MediaLibrary) object); object = objIn.readObject(); } objIn.close(); } catch(Exception e) { e.printStackTrace(); } } 

你可以试试这个。 祝你好运!

 private static void Load() { try { ObjectInputStream objIn = new ObjectInputStream(new FileInputStream("/file.bin")); boolean check=true; while (check) { try{ object = objIn.readObject(); libraryFromDisk.add((MediaLibrary) object); }catch(EOFException ex){ check=false; } } objIn.close(); } catch(Exception e) { e.printStackTrace(); } }