我有一个对象集合:
Map<BufferedImage, Map<ImageTransform, Set<Point>>> map
我想把它们写到一个文件中,然后能够在同一个结构中读回它们。
我不能按原样编写集合,因为 BufferedImage 没有实现Serializable
(也没有Externalizable
)接口。所以我需要使用ImageIO
类中的方法来编写图像。
ImageTransform
是实现的自定义对象Serializable
。所以,我相信我的地图收藏的价值部分,应该是可写的。
这是我写入文件的操作:
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file));
for (BufferedImage image : map.keySet()) {
ImageIO.write(image, "PNG", out); // write the image to the stream
out.writeObject(map.get(image)); // write the 'value' part of the map
}
这是我从文件中读回的内容:
ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
while(true) {
try {
BufferedImage image = ImageIO.read(in);
Map<ImageTransform, Set<Point>> value =
(Map<ImageTransform, Set<Point>>) in.readObject(); // marker
map.put(image, value);
} catch (IOException ioe) {
break;
}
}
但是,这不起作用。我得到一个java.io.OptionalDataException
at标记。
java.io.OptionalDataException
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1300)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:368)
我的问题是,首先,写作概念是否正确?对这种情况ImageIO#write
有好处,还是我应该考虑使用/存储BufferedImage#getRgb
int[]
数组?数组是否更紧凑(如在文件中占用更少空间)?
其次,我应该如何从文件中读取对象?我怎么知道何时达到 EOF?为什么以上不起作用?
我希望提供的信息足够,如果您需要更多信息,请告诉我。
提前致谢。