【问题标题】:Java.util.zip replace a single zip fileJava.util.zip 替换单个 zip 文件
【发布时间】: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 无法更新 Zip 文件...您需要将其解压缩到一个临时文件夹,在其中添加文件并将其打包回来再次。”
  • @FrankvanPuffelen:我的问题是骗人的。我认为我们应该关闭(但不是删除)这个问题。

标签: java zipoutputstream


【解决方案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。你知道管理这个的方法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-07
  • 1970-01-01
  • 1970-01-01
  • 2018-11-16
  • 2015-03-02
  • 2013-07-12
  • 1970-01-01
相关资源
最近更新 更多