2010-08-06 2 views
0

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

У меня теперь есть проблема, когда я, похоже, не могу сохранить изображения в zip-файле. Рабочий поток, который я построил для него, ниже. Я уверен, что изображение превращается в ImageIO.write. Результатом в конце, однако, является zip-файл с пустыми jpg. Мне интересно, может ли 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); 
     } 
    } 


} 

ответ

1

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

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

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

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

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

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

+0

Я попробую и посмотрю, работает ли это сегодня вечером. Благодарю. – Mimyck

1

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

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

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

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

+0

Согласен. В конечном счете, я не думаю, что вы сохранили бы то, что вы думаете *, которое вы спасли. ZIP-файл должен поддерживать индекс всех файлов в архиве, как стандартную несжатую файловую систему. Ваши JPEG вряд ли хорошо сжимаются с помощью ZIP, поэтому вы, вероятно, стреляете в ногу. – Quintus

+0

Причиной для zip-файла было сохранение файловой системы от индексации всех отдельных jpg. У меня есть страх работать на Unodes, сохраняя их отдельно. Проблема не заключалась в экономии места. – Mimyck