0

我正在尝试使用公共压缩 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 个字节,仅此而已。我究竟做错了什么?

4

3 回答 3

1

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

于 2015-10-20T17:59:58.437 回答
0

我对“apache commons compress”有同样的问题,bzip2 只写了 3 个字节。我最终替换ByteArrayOutputStreamFileOutputStream.

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
于 2020-01-05T21:40:20.777 回答
0

对于那些对使用Apache Commons Compress感兴趣,但正在寻找 in-memory 的人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;
}

希望这对某人有帮助!

于 2017-06-14T14:17:47.973 回答