【问题标题】:ObjectInputStream.readObject() gives EOFExceptionObjectInputStream.readObject() 给出 EOFException
【发布时间】:2013-04-01 22:39:43
【问题描述】:

我对编程完全陌生,所以我很难解决自己的错误。有人建议我在这个网站上尝试一下,所以我想为什么不试一试。

我发现的有关此错误的其他帖子似乎不太相关:大多数人建议关闭输入流,但我的代码已经这样做了。

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

实际作用: 将名为“photo”的 Photo 对象写入“test.ser”。读取“test.ser”,返回 EOFException 并且没有路径。

返回路径实际上并不是很重要,只要它返回对我有价值的东西。但是当我使用“System.out.println(photo)”或“photo.getId()”时,我遇到了同样的错误。

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

序列化对象:

    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 行的错误所指的内容。

我在别处读到该错误意味着我“试图读取比实际存在更多的对象”。不过不确定这意味着什么,因为我只希望它读取 1 张图像(应该在对象内)并返回其位置。

我还读到 ObjectInputStream 永远不会返回 null,除非我在某处给出了该值。但它实际上是返回(?)“null”,即使我的代码不包含空值......

我已经做了好几天了(是的,我就是那么糟糕),但仍然没有运气。

【问题讨论】:

标签: java objectinputstream eofexception


【解决方案1】:

你读了两遍:

    in.readObject();

    photo = (Photo)in.readObject();

删除第一行。 此外,您不必创建文件。输出流将为您执行此操作。

【讨论】:

  • 请参阅我在对 OP 问题的评论中发布的链接。那里的答案详细解释了这个问题。顺便说一句,EOFException 在这种情况下是正常的。
  • 链接中的问题似乎有所不同。此处代码写入一个 Photo 对象,但尝试从流中读取两次(我猜错了)。
  • 耶,终于让它工作了。太感谢了!就像我说的,很新。我真的没有注意到它读了两遍。此外,我的 readObject 的 getPath() 似乎是错误的,它应该包含在一个 sout 中,而不是松散的。再次感谢,你让我成为了一个快乐的露营者。
猜你喜欢
  • 2013-11-04
  • 1970-01-01
  • 1970-01-01
  • 2015-07-14
  • 2013-02-16
  • 1970-01-01
  • 2012-09-01
  • 2018-02-12
  • 1970-01-01
相关资源
最近更新 更多