调用ObjectInputStream.readObject()时发生EOFException

时间:2017-12-04 02:30:54

标签: java serialization hashmap eofexception

我需要从我已经序列化的十六进制字符串中获取一个hashmap。目前,我可以获取hashmap,但它会创建一个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

1 个答案:

答案 0 :(得分:0)

  

EOFException转换为hashmap

时的EOFE

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

  

目前,我可以获得hashmap

不,你不能。你得到一个readObject(),而不是一个HashMap。这个建议再次荒谬。

  

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

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

这里唯一的问题是无意义的 String path = songsList.get(position).get(MediaStore.Audio.Albums.ALBUM_ART); 循环。如果您要在无限循环中读取有限输入,则 not 无法到达文件末尾。

删除它。

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