【问题标题】:How do I compress with commons compress in memory?如何在内存中使用公共压缩进行压缩?
【发布时间】:2015-09-03 10:55:40
【问题描述】:

我正在尝试使用公共压缩来 bzip2 内存中的数据。我正在尝试这个:

private static final int bufferSize = 8192;

public void compress(
    ByteArrayInputStream byteArrayInputStream,
    CompressorOutputStream compressorOutputStream) throws IOException {
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    final byte[] buffer = new byte[bufferSize];
    int n = 0;
    while (-1 != (n = byteArrayInputStream.read(buffer)))
        compressorOutputStream.write(buffer, 0, n);
}

public byte[] compressBZIP2(byte[] inputBytes) throws Exception {
    ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(inputBytes);
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    BZip2CompressorOutputStream bZip2CompressorOutputStream = new BZip2CompressorOutputStream(byteArrayOutputStream);
    compress(byteArrayInputStream, bZip2CompressorOutputStream);
    return byteArrayOutputStream.toByteArray();
}

但这不起作用,

byte[] bzipCompressed = resultCompressor.compressBZIP2(contentBytes);

所有结果总是有 3 个字节,仅此而已。我究竟做错了什么?

【问题讨论】:

    标签: bzip2 bytearrayoutputstream bytearrayinputstream apache-commons-compress


    【解决方案1】:

    我在使用“apache commons compress”时遇到了同样的问题,bzip2 只写了 3 个字节。我最终将ByteArrayOutputStream 替换为FileOutputStream。

    Java 12 上的示例:

    import org.apache.commons.compress.compressors.CompressorOutputStream;
    import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream;
    import org.apache.commons.compress.compressors.bzip2.BZip2CompressorOutputStream;
    
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    
    import java.nio.charset.StandardCharsets;
    
    import java.util.Base64;
    
    public static String compress(String data) throws IOException {
            var bzip2TempFile = new File("/tmp/compressed.bzip2");
            var outputStream = new FileOutputStream(bzip2TempFile);
    
            CompressorOutputStream burrowZip2OutputStream = 
                    new BZip2CompressorOutputStream(outputStream, 9);
            burrowZip2OutputStream.write(data.getBytes(StandardCharsets.UTF_8));
            burrowZip2OutputStream.close();
    
            try (var is = new FileInputStream(bzip2TempFile)) {
                var result = new String(Base64.getEncoder().encode(is.readAllBytes()));
                bzip2TempFile.deleteOnExit();
                return result;
            }
    }
    

    测试:

    input: pirem
    bzip2: BZh91AY&SYZF???"P 0???P??H?
    
    H?@
    base64 encoded: QlpoOTFBWSZTWRhaRoIAAAGBgAIiUAAgADDNAMGgUOLuSKcKEgMLSNBA
    

    【讨论】:

      【解决方案2】:

      对于那些对使用Apache Commons Compress 感兴趣,但正在寻找内存中的bunzip2 的人,这里是一个经过测试的实现:

      import org.apache.commons.compress.compressors.CompressorInputStream;
      import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream;
      

      (..)

      private static final int bufferSize = 8192;
      
      private void uncompress(CompressorInputStream compressorInputStream, 
              ByteArrayOutputStream byteArrayOutputStream) throws IOException {
          final byte[] buffer = new byte[bufferSize];
          int n = 0;
          while (-1 != (n = compressorInputStream.read(buffer))) {
              byteArrayOutputStream.write(buffer, 0, n);
          }
          compressorInputStream.close();
          byteArrayOutputStream.close();
      }
      
      public ByteArrayOutputStream bunzip2(FileInputStream inputStream) throws IOException {
          ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
          BZip2CompressorInputStream bZip2CompressorInputStream = new BZip2CompressorInputStream(inputStream);
          uncompress(bZip2CompressorInputStream, byteArrayOutputStream);
          return byteArrayOutputStream;
      }
      

      希望这对某人有所帮助!

      【讨论】:

        【解决方案3】:

        您永远不会关闭 BZip2CompressorOutputStream,这意味着最终(可能是唯一的)数据块永远不会被写入包装的流。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-10-08
          • 2016-12-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-29
          • 1970-01-01
          相关资源
          最近更新 更多