下面的方法应该将二进制文件读入arrayList
。但得到java.io.EOFException
:
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2553) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1296) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350) at .... Read(Tester.java:400) at .... main(Tester.java:23)
主要的第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();
}
}
答案 0 :(得分:9)
根据其他答案,你在循环中阅读两次。你的另一个问题是空测试。如果你写了一个空值,readObject()
只返回null,而不是EOS,所以将它用作循环终止测试并没有多大意义。 readObject()
循环的正确终止是
catch (EOFException exc)
{
in.close();
break;
}
答案 1 :(得分:7)
问题是你在循环中调用了两次readObject()。试试这个:
MediaLibrary obj = null;
while ((obj = (MediaLibrary)objIn.readObject()) != null) {
libraryFromDisk.add(obj);
}
答案 2 :(得分:4)
您正在读取while测试中的对象:
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();
}
}
答案 3 :(得分:0)
你可以试试这个。祝你好运!
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();
}
}