У меня есть коллекция предметов:
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
на маркер .
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 достигнут? Почему не работает выше?
Надеюсь, предоставленной информации достаточно, если вам нужна дополнительная информация, пожалуйста, скажите мне.
Заранее спасибо.