我正在尝试使用 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/