1

我正在尝试将 zipfile 写入byte[]内存中,然后将其写入磁盘。生成的 zipfile 已损坏。

这有效:

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[]用于其他目的)。

4

1 回答 1

4

您可能希望在 writezos之前刷新bos,因为它直到 try-with-resources 之后才会关闭(因此当您将字节写入文件时zos不一定会刷新到)。bos

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

于 2015-05-06T14:50:05.513 回答