如何将条目添加到 Java 中的现有 zip 文件?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/3048669/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How can I add entries to an existing zip file in Java?
提问by Marlo Guthrie
Possible Duplicate:
Appending files to a zip file with Java
可能的重复:
使用 Java 将文件附加到 zip 文件
Opening the file with a ZipOutputStream overwrites it. Is there a way to keep the file and just add new entries?
使用 ZipOutputStream 打开文件会覆盖它。有没有办法保留文件并添加新条目?
回答by Jacob Mattison
You could use zipFile.entries()to get an enumeration of all of the ZipEntryobjects in the existing file, loop through them and add them all to the ZipOutputStream, and then add your new entries in addition.
您可以使用zipFile.entries()获取ZipEntry现有文件中所有对象的枚举,遍历它们并将它们全部添加到 ZipOutputStream,然后另外添加新条目。
回答by Romain Hippeau
The function renames the existing zip file to a temporary file and then adds all entries in the existing zip along with the new files, excluding the zip entries that have the same name as one of the new files.
该函数将现有 zip 文件重命名为临时文件,然后将现有 zip 中的所有条目与新文件一起添加,不包括与新文件之一同名的 zip 条目。
public static void addFilesToExistingZip(File zipFile,
File[] files) throws IOException {
// get a temp file
File tempFile = File.createTempFile(zipFile.getName(), null);
// delete it, otherwise you cannot rename your existing zip to it.
tempFile.delete();
boolean renameOk=zipFile.renameTo(tempFile);
if (!renameOk)
{
throw new RuntimeException("could not rename the file "+zipFile.getAbsolutePath()+" to "+tempFile.getAbsolutePath());
}
byte[] buf = new byte[1024];
ZipInputStream zin = new ZipInputStream(new FileInputStream(tempFile));
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFile));
ZipEntry entry = zin.getNextEntry();
while (entry != null) {
String name = entry.getName();
boolean notInFiles = true;
for (File f : files) {
if (f.getName().equals(name)) {
notInFiles = false;
break;
}
}
if (notInFiles) {
// Add ZIP entry to output stream.
out.putNextEntry(new ZipEntry(name));
// Transfer bytes from the ZIP file to the output file
int len;
while ((len = zin.read(buf)) > 0) {
out.write(buf, 0, len);
}
}
entry = zin.getNextEntry();
}
// Close the streams
zin.close();
// Compress the files
for (int i = 0; i < files.length; i++) {
InputStream in = new FileInputStream(files[i]);
// Add ZIP entry to output stream.
out.putNextEntry(new ZipEntry(files[i].getName()));
// Transfer bytes from the file to the ZIP file
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
// Complete the entry
out.closeEntry();
in.close();
}
// Complete the ZIP file
out.close();
tempFile.delete();
}
回答by Eugene Kuleshov
Here is a detailed articlefrom JavaWorld on modifying zip archives.
这是JavaWorld 中有关修改 zip 存档的详细文章。
回答by user892304
You have to be sure to add a CRC32 for uncompressed files added to a zip. Check out the example here. http://jcsnippets.atspace.com/java/input-output/create-zip-file.html
您必须确保为添加到 zip 的未压缩文件添加 CRC32。在这里查看示例。 http://jcsnippets.atspace.com/java/input-output/create-zip-file.html
You can do it in a simple way, without rewriting everything, with Zip4j. Here it shows: http://blog.michalszalkowski.com/java/zip4j-add-file-to-existing-zip-file/
您可以使用 Zip4j 以简单的方式完成此操作,而无需重写所有内容。这里显示:http: //blog.michalszalkowski.com/java/zip4j-add-file-to-existing-zip-file/
And you can do it using Zip4J's ZipOutputStream too, using SplitOutputStream together.
您也可以使用 Zip4J 的 ZipOutputStream,将 SplitOutputStream 一起使用。
<dependency>
<groupId>net.lingala.zip4j</groupId>
<artifactId>zip4j</artifactId>
<version>1.3.1</version>
</dependency>
ex:
前任:
ZipFile zipFile = new ZipFile(new File("/home/szalek/zip/core1.zip"));
ArrayList filesToAdd = new ArrayList();
filesToAdd.add(new File("/home/szalek/zip/someData.txt"));
ZipParameters parameters = new ZipParameters();
parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
//password
parameters.setEncryptFiles(true);
parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);
parameters.setPassword("test123!");
//password
zipFile.addFiles(filesToAdd, parameters);

