当前位置: 首页 > 知识库问答 >
问题:

使用ZipOutStream压缩时压缩无效

于正志
2023-03-14

我得到无效的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个答案

于嘉许
2023-03-14

问题是我在关闭zipoutput流之前返回了一个值。应该是:

  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  try (ZipOutputStream zos = new ZipOutputStream(baos)) {
    ....
  } catch (Exception e) {
    throw new RuntimeException("Exception zipping files", e);
  }
 return baos.toByteArray();
司徒志
2023-03-14

在调用baos之前,需要close()finish()zipoutpstream流。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();
}
 类似资料:
  • 我有一个学校作业,要求我接受一个输入流,并使用apache commons压缩库将其压缩成一个字节数组,格式有5种(根据用户规范)。这5种格式是:ZIP、JAR、SEVENZ、BZIP2和gzip。我编写了以下方法以JAR格式压缩输入流,但得到了一个带有字符串“no current entry”的illegalStateException。

  • 问题内容: 我知道这是一项容易的任务,但是更改代码后它停止工作,并且无法恢复!我实际上使用了两个函数来进行压缩和解压缩,尽管实际上它是“ jar”和“ unjar”,但这并没有太大的区别 任何帮助/建议吗? 创建JarFile时发生错误: 问题答案: 我不知道这是否是您的问题,但是通常最好在完成写入后关闭每个zip条目。 请参阅。 在显示的代码中,不会关闭邮政编码中的最后一个条目。您也不会显示关闭

  • tar [-]c|x|u|r|t[z|j][v] -f 归档文件 [待打包文件] 将多个文件打包为一个归档文件,可以在打包的同时进行压缩。支持的格式为 tar(归档)、gz(压缩)、bz2(压缩率更高,比较耗时) 操作选项 -c 创建 -x 解包 -u 更新 -r 添加 -t 查看 -d 比较压缩包内文件和文件 -A 将 tar 文件添加到归档文件中 格式选项 -z 使用 gz 压缩格式 -j 使

  • Tango拥有一个默认的压缩中间件,可以按照扩展名来进行文件的压缩。同时,你也可以要求某个Action自动或强制使用某种压缩。比如: type CompressExample struct { tango.Compress // 添加这个匿名结构体,要求这个结构体的方法进行自动检测压缩 } func (CompressExample) Get() string { return f

  • 所有基于http协议的服务器组件均支持压缩,请求头Accept-Encoding的值需要包含deflate或者gzip。 即便请求头Accept-Encoding的值包含deflate或者gzip,服务器还会参考静态变量http_server::zip_min_size(默认1024,即1KB)和http_server::zip_max_size(默认307200,即300KB)来决定是否压缩:仅

  • 本文向大家介绍Android图片压缩(质量压缩和尺寸压缩),包括了Android图片压缩(质量压缩和尺寸压缩)的使用技巧和注意事项,需要的朋友参考一下 在网上调查了图片压缩的方法并实装后,大致上可以认为有两类压缩:质量压缩(不改变图片的尺寸)和尺寸压缩(相当于是像素上的压缩);质量压缩一般可用于上传大图前的处理,这样就可以节省一定的流量,毕竟现在的手机拍照都能达到3M左右了,尺寸压缩一般可用于生成