Java是否将对象输入流读取到arraylist?

Java是否将对象输入流读取到arraylist?,java,fileinputstream,Java,Fileinputstream,下面的方法应该是将二进制文件读入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.readObjec

下面的方法应该是将二进制文件读入
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)
问题是您在循环中调用了两次readObject()。请尝试以下方法:

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

您正在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();
    }
}

根据其他答案,你在循环中阅读了两次。您的另一个问题是空测试
readObject()
仅当您编写了null时返回null,而不是在EOS,因此将其用作循环终止测试没有多大意义。
readObject()
循环的正确终止是

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

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

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();
}
}

仍然在while循环中得到相同的错误。我尝试过类似的方法:objectobj=null;while((obj=objIn.readObject())!=null){if(obj instanceof media library){media library list=(media library)obj;libraryFromDisk.add(list);}}}仍然在while循环中遇到相同的错误。我尝试过类似的方法:objectobj=null;而((obj=objIn.readObject())!=null){if(obj instanceof media library){media library list=(media library)obj;libraryFromDisk.add(list);}}可能objIn中的数据是另一个问题。在ObjectInputStream的Javadoc中,据说“原语读取将抛出EOFEException”。objIn是否包含原始数据?(不是类的实例)它不包含基元数据,或者至少不应该包含基元数据。这是我用来以单独方法写入文件的循环。对于(MediaLibrary项:library){objOut.writeObject(项);}我认为不能在循环外使用break。你怎么能把自己关在外面呢。显然,您可以在循环内部捕获EOFEException并中断,或者在外部捕获EOFEException并忽略中断。对于仅用于异常情况的异常来说,就到此为止@EJP我同意这是使用API的方法。我只是觉得不幸的是,一个文件的结尾(最终会出现在每个想要读取的文件中)会被称为“异常”。相反,像.isEndOfFile()这样的方法可能会更好。不管怎样,使用我们今天的API,您的答案是正确的。@David,这个建议行不通。调用isEndOfFile()后,文件可能会增长。在TCP中,除了尝试读取外,没有其他方法可以检测EOS。因此,EOS必须是一个返回值或读取的副作用,如果没有带外返回值可用,则它不能是一个返回值:在具有结果参数的语言中,它可以是一个结果参数;在Java中,它必须是一个例外。这是没有办法的。
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();
}
}