如何将图像保存为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); } } } 

代码中的错误在于:

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

它应该是:

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

我也不确定你是否应该在每个图像写完后调用closeEntry()。

考虑一下Stephen C写的内容,如果断电或VM死机,此代码可能会导致损坏的zip文件。 考虑每周对zip文件进行几次备份,甚至每天几次,以确保您的多天运行不会完全毁掉(我假设可以恢复运行)。

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

我不相信这种推理。 文件的实际数量实际上并不重要。 您可能会丢失每个文件平均1/2个(文件系统)磁盘块,但是有几百美元的TB磁盘驱动器,这可能是微不足道的。

但更重要的问题是如果您的应用程序……或电源关闭会发生什么。 如果您将所有图像直接写入ZIP文件,那么您可能最终只能使用损坏的ZIP文件进行多天运行。 我希望ZIP文件内容大部分都是可恢复的,但只能使用某些第三方(非Java)应用程序。

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