Неверный zip при сжатии с ZipOutputStream - PullRequest
0 голосов
/ 23 марта 2020

Я получаю недопустимый 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();
    }

Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 23 марта 2020

Вам необходимо close() или finish() поток ZipOutputStream до вызова baos.toByteArray().

Поскольку ByteArrayOutputStream закрывать не нужно, и / или поскольку вы можете позвонить toByteArray() даже после его закрытия, я бы порекомендовал вам переместить его за пределы блока try:

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();
}
0 голосов
/ 23 марта 2020

Проблема была в том, что я возвращал значение перед закрытием ZipOutputStream. Должно было быть:

  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  try (ZipOutputStream zos = new ZipOutputStream(baos)) {
    ....
  } catch (Exception e) {
    throw new RuntimeException("Exception zipping files", e);
  }
 return baos.toByteArray();
...