ObjectInputStream.readObject()会抛出EOFException异常。

3

我完全是新手,所以在解决自己的错误时遇到了困难。有人建议我在这个网站上尝试一下,所以我想为什么不试试呢。

我找到的其他关于这个错误的帖子似乎都不太相关:大多数人建议关闭输入流,但我的代码已经做到了这一点。

我想要它做什么:将名为“photo”的Photo对象写入名为“test.ser”的文件中。然后读取文件“test.ser”并返回该对象(“photo”)在“test.ser”中的路径。

它实际上做了什么:将名为“photo”的Photo对象写入“test.ser”。读取“test.ser”,返回EOFException和无路径。

其实返回路径并不是非常重要,只要它给我提供了一些有价值的东西就可以了。但是当我使用“System.out.println(photo)”或“photo.getId()”时,我得到了相同的错误。

我不太确定我需要粘贴什么在这里,所以我将发布我用于序列化和反序列化对象的两个try/catch块:

序列化对象:

    File test = new File("path.../something.ser");
    Photo photo = new Photo(2, "..\\images\\2.jpg", getImage("..\\images\\2.jpg"));

    try {
        FileOutputStream fos = new FileOutputStream(test);
        ObjectOutputStream out = new ObjectOutputStream(fos);

        if (!test.exists()) {
            test.createNewFile();
        }
        out.writeObject(photo);
        out.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

反序列化对象:

        try {
        FileInputStream fis = new FileInputStream(test);
        ObjectInputStream in = new ObjectInputStream(fis);

        in.readObject();

        photo = (Photo)in.readObject();
        photo.getPath();
        in.close();

    } catch (Exception e) {
        e.printStackTrace();
    }

还有错误:

run:
null
java.io.EOFException
    at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2571)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1315)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)
    at view.Main.<init>(Main.java:103) 
  //103 is the line that casts the input object to a Photo object.

BUILD SUCCESSFUL (total time: 1 second)

据我所了解,当我尝试将通过readObject方法接收的对象强制转换为“照片”类对象时,错误就会发生。至少,这就是第103行的错误所指的。
我在其他地方读到,这个错误意味着我“尝试读取比实际存在的对象更多的对象”。不过我不确定这是什么意思,因为我只想读取一个图像 - 它应该在对象中 - 并返回它的位置。
另外,我读到ObjectInputStream从不返回null,除非我在某个地方给出了那个值。但它实际上正在返回(?)“null”,尽管我的代码中没有null值...
我已经做了好几天了(是的,我就是那么菜),但还是没有运气。

1个回答

5
你读了两遍:
    in.readObject();

    photo = (Photo)in.readObject();

删除第一行。 同时您无需创建文件,输出流会代劳。


请参考我在评论中发布的链接,那里的答案详细解释了问题。顺便说一下,在这种情况下EOFException是正常的。 - Luiggi Mendoza
你链接中的问题似乎不同。这里的代码写了一个Photo对象,但尝试从流中读取两次(我猜是错误)。 - jdb
太好了,终于搞定了。非常感谢你!就像我说的,我很新手。我真的没有注意到它,读了两遍。此外,我的readObject的getPath()似乎有问题,应该包含在sout中,而不是松散的。再次感谢,你让我成为一个快乐的露营者。 - user2233788

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接