【问题标题】:EOFException while calling ObjectInputStream.readObject()调用 ObjectInputStream.readObject() 时出现 EOFException
【发布时间】:2017-12-04 02:30:53
【问题描述】:

我需要从我序列化的十六进制字符串中获取哈希图。目前,我可以获得哈希图,但它会创建一个 EOFException。

private static String writeMaterialMap(HashMap<String, Double> map) throws Exception {

    System.out.print(map);

    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);

    objectOutputStream.writeObject(map);
    objectOutputStream.close();

    byte[] bytes = byteArrayOutputStream.toByteArray();

    final StringBuilder stringBuilder = new StringBuilder();
    for (byte bytte : bytes) {
        stringBuilder.append(String.format("%02x", bytte));
    }

    System.out.print("Saving: " + stringBuilder.toString());

    return stringBuilder.toString();
}

@SuppressWarnings("unchecked")
private static HashMap<String, Double> readMaterialMap(String hex) throws Exception {

    int length = hex.length();
    byte[] byteArray = new byte[length / 2];
    for (int i = 0; i < length; i += 2) {
        byteArray[i / 2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4)
                + Character.digit(hex.charAt(i + 1), 16));
    }

    ObjectInputStream objectInputStream = new ObjectInputStream(new ByteArrayInputStream(byteArray));
    System.out.print(objectInputStream.readObject());

    HashMap<String, Double> materials = new HashMap<>((Map<String, Double>) objectInputStream.readObject());

    System.out.print(materials);

    return materials;

}

目前,我明白了:

{"A"=1}
{}
java.io.EOFException
    at java.io.ObjectInputStream$BlockDataInputStream.peekByte
    at java.io.ObjectInputStream.readObject0
    at java.io.ObjectInputStream.readObject
    at me.MapHex.readMaterialMap(MineHex.java:66)

从中我可以看到:它可以读取对象,但 EOFE 阻止我将其转换为 HashMap。我需要将其转换为没有 EOFE 的 HashMap

【问题讨论】:

  • 您在输出中看到的空地图是您自己毫无意义地创建的地图,而不是 readObject() 的结果,它抛出了异常而不是返回地图,因此,您也没有达到类型转换的程度。
  • 是的!我知道!! :P 那是我的问题。
  • 您的新代码也毫无意义。您根本不需要 new HashMap&lt;...&gt;() 部分。只是readObject() 和类型转换。你似乎只是在猜测。
  • 我完全知道我可以内联变量...这并不能解决问题

标签: java serialization hashmap eofexception


【解决方案1】:

EOFE 将 ObjectInputStream.readObject() 投射到 hashmap 时

没有。这个建议很荒谬。类型转换不会抛出 EOFExceptions。 readXXX() 方法可以做到这一点。它发生在readObject()。检查堆栈跟踪。与铸造无关。

目前可以得到hashmap

不,你不能。你得到一个EOFException,而不是一个HashMap。这个建议又是荒谬的。

从中我可以看到:它可以读取对象,但 EOFE 阻止我将其转换为 HashMap。

这里没有任何东西可以暗示任何这样的事情。你创建了一个毫无意义的空地图,试图用readObject() 的结果覆盖它,得到一个EOFException 读取对象流,并打印了你自己的空地图。

这里唯一的问题是毫无意义的while(true) 循环。如果您要在无限循环中读取有限输入,则不可能 not 到达文件末尾。

删除它。

如果异常仍然存在,则您的十六进制字符串不完整。

【讨论】:

  • 我添加它是为了让它毫无意义,当我删除它时它具有完全相同的结果。
  • 一个完全难以理解的策略,但在这种情况下,您的十六进制字符串不完整。
  • 就像我说的,输出就是编码的内容。当我尝试将其放入哈希图中时,它搞砸了。这有什么关系吗?
  • 你实际上没有说过任何这样的话,但如果十六进制是“正是编码的内容”,则编码不完整,就像 I 所说,问题出现在readObject(),而不是投射到 HashMap 时。在您的问题中显示您是如何得出十六进制的,并请提供完整的堆栈跟踪。
  • 提供的写方法
猜你喜欢
  • 1970-01-01
  • 2013-11-04
  • 1970-01-01
  • 2012-09-10
  • 1970-01-01
  • 1970-01-01
  • 2014-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多