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.FileSystem
和 Files.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 文件时出错