Java GZIP压缩和解压缩

Java GZIP压缩和解压缩,java,compression,gzip,gzipinputstream,Java,Compression,Gzip,Gzipinputstream,我使用下面的代码来压缩然后解压字符串。但是解压后我得到了不同长度的字符串,解压后的字符串中也少了几个字符 压缩: ByteArrayOutputStream baos = new ByteArrayOutputStream(); GZIPOutputStream zos = new GZIPOutputStream(baos); zos.write(text.getBytes()); zos.fin

我使用下面的代码来压缩然后解压字符串。但是解压后我得到了不同长度的字符串,解压后的字符串中也少了几个字符

压缩:

            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            GZIPOutputStream zos = new GZIPOutputStream(baos);

            zos.write(text.getBytes());
            zos.finish();
            zos.flush();

            byte[] udpBuffer = baos.toByteArray();          
            System.out.println("Compressed length: " + udpBuffer.length);
        GZIPInputStream gis = new GZIPInputStream(new ByteArrayInputStream(bytes));
        BufferedReader br = new BufferedReader(new InputStreamReader(gis));     

        StringBuilder sb = new StringBuilder();
        while (br.readLine()!= null) {
            sb.append(br.readLine());
        }

        System.err.println(sb.toString());
减压:

            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            GZIPOutputStream zos = new GZIPOutputStream(baos);

            zos.write(text.getBytes());
            zos.finish();
            zos.flush();

            byte[] udpBuffer = baos.toByteArray();          
            System.out.println("Compressed length: " + udpBuffer.length);
        GZIPInputStream gis = new GZIPInputStream(new ByteArrayInputStream(bytes));
        BufferedReader br = new BufferedReader(new InputStreamReader(gis));     

        StringBuilder sb = new StringBuilder();
        while (br.readLine()!= null) {
            sb.append(br.readLine());
        }

        System.err.println(sb.toString());
文本原始长度:45627字节
文本压缩长度:3732字节
文本未压缩长度:20328字节(应等于原始长度)

我的原文是这样的:

<html>
<head>
   <title></title>
</head>
<body>
<p><span class="preheader" style="display:none!important;mso-hide:all">Hey wazzup? </span></p>

<table align="center" border="0" cellpadding="0" cellspacing="0" width="640">
   <tbody>
       <tr>
           <td align="center" height="30" style="font-size:11px;color:#333;font-family:Verdana,Geneva,sans-serif">
.
.
.
</tbody>
</body>
</html>

嘿,笨蛋

. . .
我的解压文本是这样的(请参见缺少开始标记,以及

<title> tag, similarly many tags and other parts are missing from my uncompressed text:
<head></head><p><span class="preheader" style="display:none!important;mso-hide:all">
.
.
.
标记,类似地,我的未压缩文本中缺少许多标记和其他部分:

.
.
.
有人能指出错误吗?或者这是预期的行为吗?

while (br.readLine()!= null) {
    sb.append(br.readLine());
}


另外,应该在zos.finish()之前调用zos.flush()。

它完成了工作!谢谢!但是while的第一个版本有什么问题?“while(br.readLine()!=null)”读取一行并检查该行是否等于null。“sb.append(br.readLine())”读取下一行并将其附加到StringBuilder。该行读取“while”(br.readLine()!=null)“将被简单地丢弃,而不附加到StringBuilder。