0

我想在使用commons compress的內存中使用bzip2數據。我想這一點:如何在內存中壓縮commons compress?

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個字節,而多數民衆贊成。我究竟做錯了什麼?

回答

1

您永遠不會關閉BZip2CompressorOutputStream,這意味着最終(也可能是唯一的)數據塊永遠不會寫入包裝流。

0

對於那些有興趣使用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; 
} 

希望這可以幫助別人!

相關問題