java - Java 通货紧缩/通货膨胀流如何工作?

标签 java inflate deflate

我正在尝试使用 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.");
}

(解压时同上。)

关于java - Java 通货紧缩/通货膨胀流如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18546797/

相关文章:

java - 使用 "webdriver.firefox.marionette"时由 : java. lang.NullPointerException 引起的 UnreachableBrowserException

java - 使用 PowerMockito 模拟返回类型为 : "invalid void parameter" 的方法

android - 膨胀的 EditText 的内容

node.js - 如何在nodejs中解码deflate字符串?

java - 在单个java对象中反序列化json的父子节点数据

java - BO 和服务之间的区别?

javascript - 膨胀来自 websocket API 的响应

c - Inflate解压操作成功,无需处理完整的压缩数据

c++ - Z_DATA_ERROR 膨胀中途

apache - 在 wampserver 上启用 gzip 模块