java - Gzip 解压后多加一个字节...为什么?

标签 java gzip gzipinputstream gzipoutputstream

我编写了一个简单的 Java 代码片段,它接受一个字符串,将其转换为 byte[],然后使用 Gzip 对其进行压缩。然后它解压缩结果以取回 byte[],它现在包含一个额外的垃圾值字节。为什么这里会有一个垃圾值字节??

public static void main(String[] args) 抛出异常{

String testString = "Sample String here";
byte[] originalBytes = testString.getBytes();

ByteArrayOutputStream baos = new ByteArrayOutputStream();
GZIPOutputStream gzos = new GZIPOutputStream(baos);
gzos.write(originalBytes);
gzos.close();

byte[] compressedBytes = baos.toByteArray();

ByteArrayInputStream bais = new ByteArrayInputStream(compressedBytes);
GZIPInputStream gzis = new GZIPInputStream(bais);

ByteArrayOutputStream dbaos = new ByteArrayOutputStream();
while(gzis.available() > 0) {
    dbaos.write(gzis.read());
}
byte[] decompressedBytes = dbaos.toByteArray();
String decompressedString = new String(decompressedBytes);

System.out.println(">>" + decompressedString + "<<");
System.out.println("Size of bytes before: " + originalBytes.length);
System.out.println("Size of bytes after: " + decompressedBytes.length);

输出:

>>Sample String here�<<
Size of bytes before: 18
Size of bytes after: 19

有人能告诉我为什么会有垃圾值字节吗?如何在不更改上述代码设置的情况下摆脱它??

最佳答案

你在这里使用了available(),所以你得到了一个额外的字节。您应该读取流并检查是否有小于 0 的值。改变这个

ByteArrayOutputStream dbaos = new ByteArrayOutputStream();
while(gzis.available() > 0) {
    dbaos.write(gzis.read());
}

类似于

ByteArrayOutputStream dbaos = new ByteArrayOutputStream();
int b;
while ((b = gzis.read()) >= 0) {
    dbaos.write(b);
}

我明白了

>>Sample String here<<
Size of bytes before: 18
Size of bytes after: 18

关于java - Gzip 解压后多加一个字节...为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46555697/

相关文章:

amazon-web-services - 使用 AWS SQS 的最有效方式(使用 Golang)

C# 到 Java : Base64String, MemoryStream、GZipStream

json - Graylog 服务器无法通过 TCP::GELFDispatcher 读取 Gelf 消息 - 无法处理 GELF 消息::无法解压缩 GELF 消息负载

java - 在单元格选择 jtable 事件之前

java - 我应该选择哪个 Java OTR 库?

java - 如何使用Spring data JPA(JPARepository)实现延迟加载?

java - GZIP压缩和解压问题

java - 如何获取使用 Intent.ACTION_OPEN_DOCUMENT 选择的文件的文件扩展名?

php - 在 mysql 中存储 gzip 字符串

java - GZIPInputStream 可以与 FileInputStream 配合使用,但不能与 InputStream 配合使用