2010-08-06 109 views
0

我正在尝试读取流并将读取的图像保存为zip文件,因为这将会在多天内运行并且会生成太多的单个文件。如何将图像保存到zip文件

我现在有一个问题,我似乎无法将图像保存到zip文件。下面是我为它制作的工作线程。我确信该图像正在ImageIO.write中。最后的结果是一个空jpgs的zip文件。我想知道是否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()每幅图像已被写入后。

考虑一下Stephen C写的东西,如果断电或虚拟机死了,这段代码可能会导致损坏的zip文件。考虑每周备份一次zip文件几次,甚至每天几次,以确保您的多天运行没有完全毁坏(我假设运行可以恢复)。

+0

我会试试看看它今晚是否有效。谢谢。 – Mimyck 2010-08-07 00:52:19

1

我试图在流中读取和读取的图像保存到一个zip文件,因为这是要运行多天,并会产生太多的个人文件。

我不相信这个推理。实际的文件数量应该不是那么重要。每个文件平均可能损失1/2个(文件系统)磁盘块,但可用几百美元的TB磁盘驱动器,这可能是微不足道的。

但更重要的问题是如果您的应用程序...或电源熄灭会发生什么。如果将所有图像直接写入ZIP文件,那么很可能最终只有一个损坏的ZIP文件用于多日运行。我预计ZIP文件的内容将大部分可恢复,但只能使用某些第三方(非Java)应用程序。

如果文件系统资源(磁盘空间,inode数量,其他)是现实的担忧,那么也许你应该写一个脚本来运行(比如说)每小时一次,然后压缩写入最后一小时,并且(可能)将ZIP文件放在其他地方。

+0

同意。最终,我不认为你会保存你认为你所节省的东西。一个ZIP文件需要像一个标准的非压缩文件系统一样维护一个档案中所有文件的索引。你的JPEG不太可能使用ZIP压缩得很好,所以你可能在拍摄自己的脚。 – Quintus 2010-08-06 23:57:20

+0

压缩文件的原因是为了保存文件系统不必索引所有单独的jpgs。我有一种恐惧,即将INodes单独存储起来。这个问题从来没有节省空间。 – Mimyck 2010-08-07 00:51:45