【问题标题】:Java appending files into a zip [duplicate]Java将文件附加到zip中[重复]
【发布时间】:2012-03-07 04:36:34
【问题描述】:

可能重复:
Appending files to a zip file with Java

我有一个 zip,其中包含一些文件夹,但重要的是 dir,里面是另一个名为 folder 的文件夹,该文件夹包含很多我需要更新的文件。

我现在在 zip 之外有一个名为 dir 的目录,其中包含我需要更新的文件的文件夹,因此路径相同。如何将这些文件更新到 zip 中?

棘手的部分是 dir 位于 zip 的根目录,它包含很多文件夹,而不仅仅是文件夹,但我只需要更新文件夹中的文件,我不能弄乱文件夹之外的任何文件但仍在目录中。

这可以吗?我知道这可以使用 -u 修饰符在 bash 中完成,但如果可能的话,我更愿意使用 java 来完成。

感谢您对此问题的任何帮助

只是为了更清楚

内拉链 /dir/folder/filestoupdate

拉链外 /dir/folder/filestomoveintozip

【问题讨论】:

标签: java zip archive


【解决方案1】:

好吧,这是最后一个方法,它与我之前粘贴的方法相同,之前我实际上是从 @Qwe 之前发布的链接中的 stackoverflow 主题中获得的,但我添加了路径变量,以便它可以将文件添加到 zip 内的文件夹中

好的,现在如何在上面的示例中使用它

private void addFilesToZip(File source, File[] files, String path){
    try{
        File tmpZip = File.createTempFile(source.getName(), null);
        tmpZip.delete();
        if(!source.renameTo(tmpZip)){
            throw new Exception("Could not make temp file (" + source.getName() + ")");
        }
        byte[] buffer = new byte[4096];
        ZipInputStream zin = new ZipInputStream(new FileInputStream(tmpZip));
        ZipOutputStream out = new ZipOutputStream(new FileOutputStream(source));
        for(int i = 0; i < files.length; i++){
            InputStream in = new FileInputStream(files[i]);
            out.putNextEntry(new ZipEntry(path + files[i].getName()));
            for(int read = in.read(buffer); read > -1; read = in.read(buffer)){
                out.write(buffer, 0, read);
            }
            out.closeEntry();
            in.close();
        }
        for(ZipEntry ze = zin.getNextEntry(); ze != null; ze = zin.getNextEntry()){
            if(!zipEntryMatch(ze.getName(), files, path)){
                out.putNextEntry(ze);
                for(int read = zin.read(buffer); read > -1; read = zin.read(buffer)){
                    out.write(buffer, 0, read);
                }
                out.closeEntry();
            }
        }
        out.close();
        tmpZip.delete();
    }catch(Exception e){
        e.printStackTrace();
    }
}

private boolean zipEntryMatch(String zeName, File[] files, String path){
    for(int i = 0; i < files.length; i++){
        if((path + files[i].getName()).equals(zeName)){
            return true;
        }
    }
    return false;
}

感谢链接最终能够稍微改进该方法,以便它可以添加不在根目录中的文件,现在我是一个快乐的露营者:) 希望这对其他人也有帮助

编辑 我在该方法上做了更多工作,因此它不仅可以附加到 zip 文件中,还可以更新 zip 文件中的文件

使用这样的方法

File[] files = {new File("/path/to/file/to/update/in")};
addFilesToZip(new File("/path/to/zip"), files, "folder/dir/");

您不会使用 / 开始路径(最后一个变量),因为它不是在 zip 条目中列出的方式

【讨论】:

  • renameTo 在 Windows 中返回 false。知道为什么吗?
【解决方案2】:

很遗憾,Java 无法更新 Zip 文件。提交的增强请求14 years ago ;-)

您需要将它解压到一个临时文件夹,在其中添加文件并重新打包。

【讨论】:

  • 好吧,我的意思是我已经有了这个方法,它可以让我添加到 zip,但是它只能让我添加到根目录,但我对 java 的使用还不够好,无法真正改进它,但这是方法@ 987654322@
  • 我提取 zip 并重新打包的问题是 zip 上有签名,所以在我解压缩并重新压缩后我真的无法做到这一点
  • 看看链接的问题 - 他们推荐 TrueZip - 也许它可以解决您的问题?
  • 希望我看看谢谢
  • 好吧,我用那个方法想通了,我稍微修改了一下,让它完全按照我想要的方式工作,这是一些很酷的东西,所以实际上我们可以用 java 更新 zip 文件,现在添加我自己的答案,并将解释我做了什么以及它是如何工作的
猜你喜欢
  • 2011-01-14
  • 2013-11-12
  • 2012-03-15
  • 2014-07-01
  • 2016-01-24
  • 1970-01-01
  • 1970-01-01
  • 2020-01-21
相关资源
最近更新 更多