如何将图像保存为zip文件

时间:2010-08-06 23:02:56

标签: java image 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);
        }
    }


}

2 个答案:

答案 0 :(得分:2)

代码中的错误在以下行中:

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

应该是:

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

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

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

答案 1 :(得分:1)

  

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

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

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

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