在Java中:如何从byte []数组中压缩文件?

net*_*tic 43 java zip

我的应用是通过SMTP服务器接收电子邮件.电子邮件和电子邮件附件中有一个或多个附件返回byte [](使用sun javamail api).

我试图动态压缩附件文件而不先将它们写入磁盘.

有什么/可能的方法来实现这一结果?

Dav*_* L. 110

您可以使用Java的java.util.zip.ZipOutputStream在内存中创建一个zip文件.例如:

public static byte[] zipBytes(String filename, byte[] input) throws IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ZipOutputStream zos = new ZipOutputStream(baos);
    ZipEntry entry = new ZipEntry(filename);
    entry.setSize(input.length);
    zos.putNextEntry(entry);
    zos.write(input);
    zos.closeEntry();
    zos.close();
    return baos.toByteArray();
}
Run Code Online (Sandbox Code Playgroud)

  • @AshishBurnwal ZipOutputStream 执行实际的压缩和编码。它从数组中获取字节并生成压缩的字节流,并将其馈送到 ByteArrayOutputStream。然后,我们从底层流访问并返回那些压缩、编码的字节以返回它们。 (3认同)
  • 先生,救了我的一天! (2认同)
  • @Deve 我有同样的情况,但我必须压缩 5 个文件。有什么建议吗。 (2认同)
  • @Deva 您可以为您喜欢的许多文件重复 ZipEntry 部分。 (2认同)
  • 谢谢它有效,但我想知道为什么我们需要 ZipOutputStream,因为我们直接使用 ByteArrayOutputStream (即我们正在返回 baos) (2认同)

Jes*_*hez 12

我有同样的问题,但我需要一个 zip 中的许多文件。

 protected byte[] listBytesToZip(Map<String, byte[]> mapReporte) throws IOException {
    String extension = ".pdf";
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ZipOutputStream zos = new ZipOutputStream(baos);
    for (Entry<String, byte[]> reporte : mapReporte.entrySet()) {
        ZipEntry entry = new ZipEntry(reporte.getKey() + extension);
        entry.setSize(reporte.getValue().length);
        zos.putNextEntry(entry);
        zos.write(reporte.getValue());
    }
    zos.closeEntry();
    zos.close();
    return baos.toByteArray();
}
Run Code Online (Sandbox Code Playgroud)