1

Deflater と InflaterOutputStream を使用して、数バイトのデータを圧縮および解凍しようとしています。

問題は、圧縮が機能しているように見えることです (ランダムなテスト データがあっても、圧縮されたデータは常に同じであるため、わかりません)。しかし、解凍は何も返しません。

私は何を間違っていますか?

私のコンソール出力:

テストデータ: 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.");
}
4

1 に答える 1

2

問題は、ストリームをフラッシュしているだけだということです。これは、圧縮解除に影響を与える可能性のある、これ以上データがないことを必ずしも意味するわけではありません。

両方のflush()呼び出しを に変更close()すると、適切なデータが返されることがわかります... または、try-with-resources ステートメントを使用しているので、内部ストリームを閉じて、その後まで待ちます電話toByteArray

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.");
}

(解凍時も同様)

于 2013-08-31T10:00:00.513 に答える