我需要从我已经序列化的十六进制字符串中获取一个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
答案 0 :(得分:0)
将
时的EOFEEOFException
转换为hashmap
没有。这个建议很荒谬。 Typecasts不会抛出readXXX()
。 readObject()
方法可以做到这一点。它发生在EOFException
。检查堆栈跟踪。与任何铸造无关。
目前,我可以获得hashmap
不,你不能。你得到一个readObject()
,而不是一个HashMap。这个建议再次荒谬。
我可以从中看到:它可以读取对象,但EOFE阻止我将其转换为HashMap。
这里没有任何暗示任何这样的事情。你创建了一个毫无意义的空地图,试图用EOFException
的结果覆盖它,得到一个while(true)
读取对象流,并打印你自己的空地图。
这里唯一的问题是无意义的 String path = songsList.get(position).get(MediaStore.Audio.Albums.ALBUM_ART);
循环。如果您要在无限循环中读取有限输入,则 not 无法到达文件末尾。
删除它。
如果异常仍然存在,则您的十六进制字符串不完整。