Как сохранить изображения в ZIP-файл - PullRequest
1 голос
/ 07 августа 2010

Я пытаюсь прочитать в потоке и сохранить прочитанные изображения в zip-файл, так как он будет работать в течение нескольких дней и будет генерировать слишком много отдельных файлов.

У меня возникла проблема, когда я не могу сохранить изображения в zip-файл.Рабочий поток, который я построил для этого ниже.Я уверен, что изображение делает это в ImageIO.write.Результатом в конце, однако, является zip-файл пустых jpgs.Мне интересно, если возможно ImageIO не записывает свойство в ZipOutputStream.

Спасибо за вашу помощь.

public class ZipSaveWorker implements Runnable{

    public static ZipOutputStream out=null;
    BufferedImage myImage;
    private static int counter=0;



    public void run() {
        ZipEntry entry=new ZipEntry("video"+counter+".jpg");
        counter++;
        try {
            out.putNextEntry(entry);
            ImageIO.write(myImage, ".jpg", out);

        } catch (IOException ex) {
            Logger.getLogger(ZipSaveWorker.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public ZipSaveWorker(BufferedImage image)
    {
        if (out==null)
        {
            try {
                out = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(new File("images" + File.separator + "video.zip"))));
            } catch (FileNotFoundException ex) {
                Logger.getLogger(ZipSaveWorker.class.getName()).log(Level.SEVERE, null, ex);
            }
            counter=0;
        }

        myImage=image;

    }

    public static void closeStream()
    {
        try {
            out.flush();
            out.close();
        } catch (IOException ex) {
            Logger.getLogger(ZipSaveWorker.class.getName()).log(Level.SEVERE, null, ex);
        }
    }


}

Ответы [ 2 ]

2 голосов
/ 07 августа 2010

Ошибка в вашем коде в строке:

ImageIO.write(myImage, ".jpg", out);

Это должно быть:

ImageIO.write(myImage, "jpg", out);

Я также не уверен, следует ли вам вызывать closeEntry () после каждого изображениябыл написан.

Посмотрите, что пишет Стивен С. Этот код может привести к повреждению zip-файлов, если питание было отключено или ВМ умерла.Подумайте о том, чтобы делать резервные копии zip-файлов несколько раз в неделю, возможно, даже несколько раз в день, чтобы гарантировать, что многодневные прогоны не будут полностью разрушены (я предполагаю, что прогон можно возобновить).

1 голос
/ 07 августа 2010

Я пытаюсь прочитать в потоке и сохранить прочитанные изображения в zip-файл, так как он будет работать в течение нескольких дней и будет генерировать слишком много отдельных файлов.

Меня не убеждают эти рассуждения.Фактическое количество файлов не должно иметь большого значения.Вы можете потерять в среднем 1/2 a (файловая система) дискового блока на файл, но при наличии терабайтных дисководов за пару сотен долларов это, вероятно, незначительно.

Но более важная проблема заключается в том, что произойдет, есливаше приложение ... или питание отключается.Если вы запишите все свои изображения прямо в ZIP-файл, есть вероятность, что в результате многодневной пробежки у вас останется только поврежденный ZIP-файл.Я ожидаю, что содержимое файла ZIP будет в основном восстанавливаемым, но только с использованием какого-либо стороннего (не Java) приложения.

Если ресурсы файловой системы (дисковое пространство, число inode и т. Д.) Равны реалистично беспокойство, тогда, возможно, вам следует написать скрипт для запуска (скажем) один раз в час и заархивировать файлы, которые были записаны за последний час, и (возможно) поместить файл ZIP в другое место.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...