Java通货紧缩/通货膨胀流是如何工作的?

Java通货紧缩/通货膨胀流是如何工作的?,java,inflate,deflate,Java,Inflate,Deflate,我试图用Deflater和InflaterOutputStream压缩和解压缩一些字节的数据 问题是压缩似乎有效(我不知道) 当然,因为即使我有随机测试数据,压缩数据也总是相同的)。 但是解压完全没有结果 我做错了什么 我的控制台输出: 测试数据:D8A8E00821608F227AE473774E177216 压缩数据:789C 解压缩数据: 我的节目: SecureRandom random = new SecureRandom(); byte[] testdata = new byte[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.");
}

问题是你只是在刷新流,这并不一定意味着没有更多的数据,这会影响解压

如果将两个
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.");
}

(解压时也一样。)

哇,谢谢。使用try with resources语句让我非常兴奋,以至于我完全忘记了这一点。@JohnFrost:我没有注意到您正在使用它-所以根本不用麻烦调用
close()
,而是将
toByteArray
调用移到内部
try
块之外。我编辑了我的答案来说明这一点。