HashMap с объектами, содержащими BufferedImage, не записывает в файл должным образом.Как найти причину? - PullRequest
0 голосов
/ 28 октября 2018

Я пытаюсь создать простую «базу данных» на основе 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();
                        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...