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

7

问题

我有一个现有的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中的重复问题 - Frank van Puffelen
从这些问题中,最简洁的总结是:“不幸的是,Java 无法更新 Zip 文件... 您需要将其解压缩到临时文件夹中,在那里添加文件,然后再次打包它。” - Frank van Puffelen
@FrankvanPuffelen:我的问题是一个重复的问题。我认为我们应该关闭(但不删除)这个问题。 - user1647794
1个回答

23

我认为你很有运气。

使用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 Provider来“挂载”zip文件。然后,您可以将任何想要的东西复制到其中。更改似乎会在fs.close()发生。

在oracle阅读更多


我喜欢。学习java.nio.file.FileSystem特别酷。谢谢! - user1647794
2
谢谢,这就是我在寻找的内容。使用这种方法,我可以将txt文件添加到zip的主文件夹中,但我无法深入更多层级。我想将一个txt文件添加到zip文件内部的一个文件夹中。当我将代码更改为Path fileInsideZipPath = fs.getPath("res/raw/mytextfile.txt");时,我会收到java.nio.file.NoSuchFileException: res/raw的消息。你知道如何处理这个问题吗? - irmakoz
文件夹存在吗?如果不存在,您需要创建它。我认为压缩包内的名称是区分大小写的。 - Aksel Willgert
是的,该文件夹存在,并且所有名称都是小写的。 - irmakoz
1
如果文件已经存在于zip文件中,您将会得到一个 java.nio.file.FileAlreadyExistsException 异常。在这种情况下,您需要添加一个 CopyOption,如下所示:Files.copy(myFilePath, fileInsideZipPath, StandardCopyOption.REPLACE_EXISTING); - user14972917
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接