压缩流操作得到错误“java”。util。拉链ZipException:标题检查不正确'
当我尝试使用流操作来压缩和解压缩字符串数据时,我遇到了一个奇怪的错误。 确切地说,控制台中的错误信息指向“充气输入流”。在我的“解压缩()”中读取()
java.util.zip.ZipException: incorrect header check
at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:164)
at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:122)
at mytest.decorator.demo.CompressionDecorator.decompress(CompressionDecorator.java:98)
但是,我发现如果我在“compress()”中不使用流式操作也可以。因此,我认为问题在于流式操作。 到底怎么了?有人能帮我吗
非常感谢
我的代码如下:
private String compress(String strData) {
byte[] result = strData.getBytes();
Deflater deflater = new Deflater(6);
boolean useStream = true;
if (!useStream) {
byte[] output = new byte[128];
deflater.setInput(result);
deflater.finish();
int compressedDataLength = deflater.deflate(output);
deflater.finished();
return Base64.getEncoder().encodeToString(output);
}
else {
ByteArrayOutputStream btOut = new ByteArrayOutputStream(128);
DeflaterOutputStream dfOut = new DeflaterOutputStream(btOut, deflater);
try {
dfOut.write(result);
dfOut.close();
btOut.close();
return Base64.getEncoder().encodeToString(result);
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
}
private String decompress(String strData) {
byte[] bts = Base64.getDecoder().decode(strData);
ByteArrayInputStream bin = new ByteArrayInputStream(bts);
InflaterInputStream infIn = new InflaterInputStream(bin);
ByteArrayOutputStream btOut = new ByteArrayOutputStream(128);
try {
int b = -1;
while ((b = infIn.read()) != -1) {
btOut.write(b);
}
bin.close();
infIn.close();
btOut.close();
return new String(btOut.toByteArray());
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
# 1 楼答案
找到根本原因
字节数组“结果”的内容未更改。因此,如果使用“result”则不起作用,因为字符串数据实际上没有被压缩
正确的用法是“ByteArrayOutputStream”。“compress()”中的toByteArray(),如下所示: