我正在尝试读取流并将读取的图像保存到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);
}
}
}
答案 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文件放在其他地方。