java在内存中递归创建NESTED zip

时间:2017-07-28 15:56:20

标签: java

这是我创建一个包含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);

如何动态地在一个回合中递归拉链拉链?有没有办法将ZipOutputStreamZipEntry放在彼此内?

编辑:

马克建议的解决方案:

    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);

2 个答案:

答案 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的数据。