java - 使用 ZipOutputStream 压缩时 zip 无效

标签 java zipoutputstream

在写入以下代码时,我得到无效的 zip:

public static byte[] zip(final Map<String, byte[]> mapReports) {

  try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
      ZipOutputStream zos = new ZipOutputStream(baos)) {
    for (Map.Entry<String, byte[]> report : mapReports.entrySet()) {
      ZipEntry entry = new ZipEntry(report.getKey());
      zos.putNextEntry(entry);
      zos.write(report.getValue());
      zos.closeEntry();
    }
    return baos.toByteArray();
  } catch (Exception e) {
    throw new RuntimeException("Exception zipping files", e);
  }
}

我将其写入文件的方式是:

    byte[] zip = zip(mapReports);
    File file = new File("demo.zip");

    try {
        OutputStream os = new FileOutputStream(file);
        os.write(zip);
        os.close();
    } catch (Exception e) {
        e.printStackTrace();
    }

我做错了什么?

最佳答案

在调用 baos 之前,您需要close()finish() ZipOutputStream .toByteArray().

由于 ByteArrayOutputStream 不需要关闭,和/或即使在关闭后您也可以调用 toByteArray(),所以我建议您将其移到 try block 之外:

public static byte[] zip(final Map<String, byte[]> mapReports) {
  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  try (ZipOutputStream zos = new ZipOutputStream(baos)) {
    for (Map.Entry<String, byte[]> report : mapReports.entrySet()) {
      zos.putNextEntry(new ZipEntry(report.getKey()));
      zos.write(report.getValue());
    }
  } catch (Exception e) {
    throw new RuntimeException("Exception zipping files", e);
  }
  return baos.toByteArray();
}

关于java - 使用 ZipOutputStream 压缩时 zip 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60818315/

相关文章:

java - 从 hibernate session 中删除对象

java - 安卓按钮: onClick not working

java.sql.SQLRecoverableException : IO Error: NL Exception was generated

java - bash 命令在 tomcat/java Runtime.getRuntime.exec() 中失败,但可以从命令行运行

java - 将文件转换为 xml,然后将其添加到 zip

Java zip 程序生成损坏的 zip 文件

java - 如何用java发送0x99?

java - PHP 中 ZipArchive 的损坏提取

java - 使用 Java 在内存中创建 zip 文件时出错

Java ZipOutputStream 只放气某些文件/放气过滤器