【问题标题】:Java read object input stream into arraylist?Java将对象输入流读入arraylist?
【发布时间】:2011-06-26 14:02:49
【问题描述】:

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

在 java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2553) 在 java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1296) 在 java.io.ObjectInputStream.readObject(ObjectInputStream.java:350) 在 .... 读取(Tester.java:400) 在 .... 主要(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();
    }
}

【问题讨论】:

    标签: java fileinputstream


    【解决方案1】:

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

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

    【讨论】:

    • 我认为你不能在循环之外使用 break。以及如何在尝试之外关闭。
    • @ash 你不能。显然,您要么在循环内捕获 EOFException 并中断,要么在外部捕获它并省略中断。
    • 对于仅用于特殊情况的异常来说,太多了​​!
    • @EJP 我同意这是使用 API 的方式。我只是觉得不幸的是,文件结尾会被称为“异常”,最终会出现在每个想要读取的文件中。相反,像 in.isEndOfFile() 这样的方法可能会很好。无论如何,使用我们今天拥有的 API,您的答案是正确的。
    • @David 该建议行不通。调用 isEndOfFile() 后文件可能会增长。在 TCP 中,除了尝试读取之外,没有其他方法可以检测 EOS。因此,EOS 必须是返回值或读取的副作用,如果没有可用的带外返回值,则它不能是返回值:在具有结果参数的语言中,它可以是结果参数;在Java中它必须是一个例外。没有办法解决这个问题。
    【解决方案2】:

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

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

    【讨论】:

    • 在 while 循环中仍然出现相同的错误。我曾尝试过类似的东西: Object obj = null; while ((obj = objIn.readObject()) != null) { if (obj instanceof MediaLibrary) { MediaLibrary list = (MediaLibrary) obj; libraryFromDisk.add(list); } }
    【解决方案3】:

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

    【讨论】:

    • 在 while 循环中仍然出现相同的错误。我曾尝试过类似的东西: Object obj = null; while ((obj = objIn.readObject()) != null) { if (obj instanceof MediaLibrary) { MediaLibrary list = (MediaLibrary) obj; libraryFromDisk.add(list); } }
    • 也许objIn中的数据是另一个问题。在 ObjectInputStream 的 Javadoc 中,据说“原始读取会抛出 EOFExceptions”。 objIn 是否包含原始数据? (不是类的实例)
    • 它不包含原始数据,或者至少不应该包含。这是我用来以单独方法编写文件的循环。 for(MediaLibrary item: library) { objOut.writeObject(item); }
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-04
      • 1970-01-01
      • 2011-07-17
      • 1970-01-01
      相关资源
      最近更新 更多