Java.util.zip 替换单个 zip 文件

Posted

技术标签:

【中文标题】Java.util.zip 替换单个 zip 文件【英文标题】:Java.util.zip replace a single zip file 【发布时间】:2012-12-09 12:20:02 【问题描述】:

问题

我有一个现有的 zip 文件“main.zip”。我想替换其中的一个文件,“比如 main.zip/foo。”

我知道:

http://docs.oracle.com/javase/7/docs/api/java/util/zip/ZipOutputStream.html

但是,这并不能满足我的要求,因为它会创建一个新的 Zip 文件——因此我还必须在 main.zip 中添加所有现有条目。

问题:

有没有办法在 Java 的 Zip 存档中“替换”单个文件? (无需重新创建新的 zip 存档并复制所有旧数据)。

【问题讨论】:

Java appending files into a zip的可能重复 从其中一个问题中得出了最简洁的摘要:“不幸的是,Java 无法更新 Zip 文件...您需要将其解压缩到一个临时文件夹,在其中添加文件并将其打包回来再次。” @FrankvanPuffelen:我的问题是骗人的。我认为我们应该关闭(但不是删除)这个问题。 【参考方案1】:

我认为你很幸运。

使用 java 7 java.nio.file.FileSystemFiles.copy() 我设法在瞬间将一个文本文件插入到一个大的 zip 文件中。

public static void main(String[] argv) 
    Path myFilePath = Paths.get("c:/dump2/mytextfile.txt");

    Path zipFilePath = Paths.get("c:/dump2/myarchive.zip");
    try( FileSystem fs = FileSystems.newFileSystem(zipFilePath, null) )
        Path fileInsideZipPath = fs.getPath("/mytextfile.txt");
        Files.copy(myFilePath, fileInsideZipPath);
     catch (IOException e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
    

它使用 ZipFileSystem 提供程序“挂载”zip。然后,您可以将任何您想要的内容复制到其中。更改似乎发生在fs.close()

Read more @ oracle

【讨论】:

我喜欢。 (学习 java.nio.file.FileSystem 特别爽)。谢谢1 嘿@AkselWillgert 你能帮我this吗? 不幸的是,ZipFileSystem 在尝试使用 Files.copy 以这种方式添加大文件时会耗尽内存。 我想我尝试过比较大的文件,但可能记错了。您在这里说的是什么尺寸和计算机系统? 谢谢,这正是我想要的。通过使用这种方法,我可以将 txt 文件添加到 zip 的主文件夹中,但我不能更深入。我想将 txt 文件添加到 zip 文件内的文件夹中。当我将代码更改为 Path fileInsideZipPath = fs.getPath("res/raw/mytextfile.txt");我得到 java.nio.file.NoSuchFileException: res/raw。你知道管理这个的方法吗?

以上是关于Java.util.zip 替换单个 zip 文件的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在使用 java.util.zip.ZipFile 打开空 ZIP 文件时出现异常?

java.util.zip获取Zip文件条目InputStream

java.util.zip压缩打包文件总结二: ZIP解压技术

JBoss5:由于 java.util.zip.ZipException 无法部署:打开 zip 文件时出错

为啥我的 java.util.zip 函数显示不一致的行为?

Java ZIP压缩文件使用总结