2013-08-31 54 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語句。 –

相關問題