这是我创建一个包含3个文件的简单zip存档
的方法 FileOutputStream fos = new FileOutputStream(new File("out.zip"));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try (ZipOutputStream zos = new ZipOutputStream(baos)) {
for (int i = 0; i < 3; i++) {
String s = "hello world " + i;
ZipEntry entry = new ZipEntry("text" + i + ".txt");
zos.putNextEntry(entry);
zos.write(s.getBytes());
zos.closeEntry();
}
}
baos.writeTo(fos);
如何动态地在一个回合中递归拉链拉链?有没有办法将ZipOutputStream
或ZipEntry
放在彼此内?
编辑:
马克建议的解决方案:
FileOutputStream fos = new FileOutputStream(new File("out.zip"));
ByteArrayOutputStream resultBytes = new ByteArrayOutputStream();
ByteArrayOutputStream zipOutStream = new ByteArrayOutputStream();
try (ZipOutputStream zos2 = new ZipOutputStream(zipOutStream)) {
String s = "hello world ";
ZipEntry entry = new ZipEntry("text.txt");
zos2.putNextEntry(entry);
zos2.write(s.getBytes());
zos2.closeEntry();
zos2.close();
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try (ZipOutputStream zos = new ZipOutputStream(baos)) {
ZipEntry entry = new ZipEntry("text.zip");
zos.putNextEntry(entry);
zos.write(zipOutStream.toByteArray());
zos.closeEntry();
}
baos.writeTo(resultBytes);
resultBytes.writeTo(fos);
答案 0 :(得分:1)
我尝试使用'ByteArrayOutputStream'遵循解决方案,但只能设法以这种方式创建损坏的zip文件。
我最终像这样直接创建了一个嵌套的ZipOutputStream:
try (FileOutputStream fos = new FileOutputStream(myZipFile); ZipOutputStream zos = new ZipOutputStream(fos)) {
ZipEntry entry = new ZipEntry("inner.zip");
zos.putNextEntry(entry);
ZipOutputStream nestedZos = new ZipOutputStream(zos);
// write stuff to nestedZos
nestedZos.finish();
zos.closeEntry();
}
生成的zip文件包含嵌套结构,并且有效。
答案 1 :(得分:0)
对于&#34;内部&#34; .ZIP文件,您可以使用ByteArrayOutputStream
代替FileOutputStream
;然后该zip将被构建为RAM中的数据;所以你可以使用结果字节数组作为外部.ZIP文件中ZipEntry
的数据。