Я пытаюсь создать простую «базу данных» на основе HashMap.HashMap содержит ключ String и объект в качестве значения.Объект содержит 12 строк и ArrayList BufferedImage .Весь HashMap записывается в файл, который я хочу прочитать позже.Я знаю, что BufferedImage не сериализуемо напрямую, но это можно сделать с помощью простого кода.
Проблема возникает, когда я пытаюсь загрузить изображения из HashMap, загруженного из файла .Первое изображение в моем списке загружается без каких-либо проблем, однако, когда я пытаюсь прочитать второе изображение, получается, что оно пустое.
Я знаю, что изображения правильно инициализируются перед их сохранением в файл в HashMap, потому что при сохраненииих напрямую на диск не работает.Я понятия не имею, как проверить, что вызывает эту проблему, был бы очень признателен за любые советы о том, как решить эту ошибку.
Вот мой код:
Сериализация BufferedImage:
transient ArrayList<BufferedImage> images = new ArrayList<BufferedImage>();
private String ID_HASH; // used as a key for hashmap
//CUSTOM SERIALIZATION METHODS
private void writeObject(ObjectOutputStream out) throws IOException {
out.defaultWriteObject();
out.writeInt(images.size()); // how many images are serialized?
for (BufferedImage eachImage : images) {
ImageIO.write(eachImage, "jpg", out);
}
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
final int imageCount = in.readInt();
images = new ArrayList<BufferedImage>(imageCount);
for (int i=0; i<imageCount; i++) {
images.add(ImageIO.read(in));
}
}
Откройте файл, прочитайте imagesList и сохраните каждое изображение на диск:
fileStream = new FileInputStream("E:/flashad-bundle/database_" + userLogin.split("@")[0]);
ObjectInputStream ois = new ObjectInputStream(fileStream);
database = (HashMap<String, AdvertisementData>) ois.readObject();
ois.close();
fileStream.close();
System.out.println(">saving images to temp");
Set<String> keys = database.keySet();
for(String key : keys) {
System.out.println("loaded " + database.get(key).getImageList().size() + " images");
for(int imgPos = 0; imgPos < database.get(key).getImageList().size(); imgPos++) {
if(database.get(key).getImageList().get(imgPos) == null)
System.out.println("IMAGE IS NULL!");
//here the first image is saved to disk without any problem,
//the second one however is null so it prints above message.
OutputStream output = new FileOutputStream("E:/flashad-bundle/IMAGEBUFFER/"+imgPos+".jpg");
BufferedImage image = database.get(key).getImageList().get(imgPos);
ImageIO.write(image, "jpg", output);
output.close();
}