8

你好 Java 开发人员。我收到如下标题和正文的响应,但是当我尝试使用下面的代码对其进行解压缩时,它会失败并出现以下异常:

java.io.IOException:不是 GZIP 格式

回复:

HTTP/1.1 200 正常
内容类型:文本/xml;字符集=utf-8
内容编码:gzip
服务器:码头(6.1.x)
▼ ═UMs¢0►=7┐ép?╙6-C╚$╢gΩ↓╟±╪₧∟zS╨╓╓♦$FÆ╒÷▀G┬╚╞8N≤╤Cf°►╦█╖╗o ↨æJÄ+`:↓2
♣»└√S▬L&?∙┬_)U╔|♣%ûíyk_à\,æ] hⁿ?▀xΓ∟o╜4♫ù\#MAHG?┤(Q¶╞⌡▌Ç?▼ô[7Fí¼↔ φ☻I%╓╣Z♂?¿↨F;x|♦o/A╬♣╘≡∞─≤╝╘U∙♥0☺æ?|J%à{(éUmHµ %σl┴▼Ç9♣┌Ç ?♫╡5╠yë~├╜♦íi♫╥╧
╬û?▓ε?╞┼→RtGqè₧ójWë♫╩∞j05├╞┘|>┘º∙↑j╪2┐|= ÷²
eY\╛P?#5wÑqc╙τ♦▓½Θt£6q∩?┌4┼t♠↕=7æƒ╙?╟|♂;║)∩÷≈═^╛{v⌂┌∞◄>6ä╝|

代码:

byte[] b=  IOUtils.toByteArray(sock.getInputStream());

ByteArrayInputStream bais = new ByteArrayInputStream(b);
GZIPInputStream gzis = new GZIPInputStream(bais);
InputStreamReader reader = new InputStreamReader(gzis);
BufferedReader in = new BufferedReader(reader);

String readed;
while ((readed = in.readLine()) != null) {
    System.out.println("read:  "+readed);
}

请指教。

谢谢,

普拉迪普

4

3 回答 3

2

MIME 标头不是 GZIP 格式,而是纯文本。在解压缩流之前,您必须先阅读它。

另外,为什么不直接使用这个:

InputStream in = sock.getInputStream();
readHeader(in);
InputStream zin = new GZIPInputStream(in);
于 2013-05-17T01:42:08.900 回答
1

所有这些都有图书馆。例如,您可以使用Apache HTTP Components,或者您可以阅读其开源代码以了解其功能。至少,请阅读相关规范。

于 2016-01-10T18:50:11.657 回答
0

我第二个 bmarguiles 的回答。

只有正文response-body在 RFC 中)被压缩,因此您只需解压缩\r\n\r\n.

一般来说,你可以通过双 CRLF 将响应减半,然后只解压缩后半部分。

于 2016-01-10T18:58:45.123 回答