2013-08-31 48 views
1

我试图用Deflater和InflaterOutputStream压缩和解压缩一些字节的数据。Java通货紧缩/通货膨胀流如何工作?

问题是,压缩似乎工作(我不是 肯定,因为压缩数据总是相同的,即使我有随机测试数据)。 但是,减压没有任何回报。

我在做什么错?

我的控制台输出:

测试数据:D8A8E00821608F227AE473774E177216

压缩数据:789C

解压数据:

我的程序:

SecureRandom random = new SecureRandom(); 
byte[] testdata = new byte[16]; 
random.nextBytes(testdata); 
System.out.println("Test data: " + DatatypeConverter.printHexBinary(testdata)); 

byte[] compressed = null; 
try (ByteArrayOutputStream buffer = new ByteArrayOutputStream()) 
{ 
    try (DeflaterOutputStream stream = new DeflaterOutputStream(buffer)) 
    { 
     stream.write(testdata); 
     stream.flush(); 
     compressed = buffer.toByteArray(); 
     System.out.println("Compressed data: " + DatatypeConverter.printHexBinary(compressed)); 
    } 
} 
catch (IOException e) 
{ 
    System.out.println("IOException during compression."); 
} 

byte[] decompressed = null; 
try (ByteArrayOutputStream buffer = new ByteArrayOutputStream()) 
{ 
    try (InflaterOutputStream stream = new InflaterOutputStream(buffer)) 
    { 
     stream.write(compressed); 
     stream.flush(); 
     decompressed = buffer.toByteArray(); 
     System.out.println("Decompressed data: " + DatatypeConverter.printHexBinary(decompressed)); 
    } 
} 
catch (IOException e) 
{ 
    System.out.println("IOException during decompression."); 
} 

回答

2

的问题是,你'只有冲洗流 - 这并不一定意味着没有更多的数据来,这可能会影响解压缩。

如果你改变你的两个电话flush()close(),你会看到你会得到相应的数据备份...或者你使用一个try-与资源的语句,只是让这种关闭 (解压缩时同上。)

try (ByteArrayOutputStream buffer = new ByteArrayOutputStream()) 
{ 
    try (DeflaterOutputStream stream = new DeflaterOutputStream(buffer)) 
    { 
     stream.write(testdata); 
    } 
    compressed = buffer.toByteArray(); 
    System.out.println("Compressed data: " + Arrays.toString(compressed)); 
} 
catch (IOException e) 
{ 
    System.out.println("IOException during compression."); 
} 

+0

哇,谢谢:流,等到以后调用toByteArray。我对使用试用资源语句感到非常兴奋,我完全忘记了这一点。 –

+0

@JohnFrost:我没有注意到你正在使用它 - 所以根本不用打扰调用'close()',而是将你的'toByteArray'调用*放在内部'try'块之外。我编辑了我的答案来证明这一点。 –

+0

天才,谢谢。我从未使用过新的try语句。 –

相关问题