我试图将一个zipfile写入内存中的byte[],然后将其写出到磁盘。生成的zip文件已损坏。

这有效:

try (FileOutputStream fos = new FileOutputStream(Files.createTempFile("works", ".zip").toFile());
     ZipOutputStream zos = new ZipOutputStream(fos)) {
    zos.putNextEntry(new ZipEntry("test.txt"));
    zos.write("hello world".getBytes());
    zos.closeEntry();
}


这已损坏并创建了损坏的zip文件:

try (ByteArrayOutputStream bos = new ByteArrayOutputStream();
     ZipOutputStream zos = new ZipOutputStream(bos)) {
    zos.putNextEntry(new ZipEntry("test.txt"));
    zos.write("hello world".getBytes());
    zos.closeEntry();

    Files.write(Files.createTempFile("broken", ".zip"), bos.toByteArray());
}


为什么第二个不起作用?以及假设我需要对原始的byte[]进行操作(我无法将zip文件直接创建到文件中,因为出于其他目的需要byte[])时,该如何解决。

最佳答案

您可能想在编写zos之前刷新bos,因为直到try-with-resources之后它才会关闭(因此zos不一定在编写时刷新到bos要归档的字节)。

编辑:您需要调用zos.finish();以...完成压缩。 close()方法将正常调用它。

10-05 18:34