14

HTTP Content-Encodingがdeflateに設定されているURLConnectionストリームを処理するには、どのInputStreamタイプを使用する必要がありますか?

gzipまたはzipのコンテンツエンコーディングの場合、GZIPInputStreamを使用します。問題ありません。

「deflate」のコンテンツエンコーディングの場合、InflaterInputStreamDeflaterInputStreamを使用してみましたが、

java.util.zip.ZipException:java.util.zip.InflaterInputStream.read(InflaterInputStream.java:147)の不明な圧縮方法

私の理解では、「deflate」エンコーディングはZlib圧縮を指し、ドキュメントによると、これはInflaterInputStreamによって処理される必要があります。

4

2 に答える 2

23

HTTP / 1.1では、RFC 1950Content-encoding: deflateで定義されているように、実際にはDEFLATE圧縮アルゴリズムを指し、RFC1950で定義されいるようにzlibデータ形式でラップされています。

ただし、一部のベンダーは、RFC 1950で定義されているようにDEFLATEアルゴリズムを実装し、RFC 1950を完全に無視します(zlibヘッダーなし)。

他の人も同じ問題に見舞われています:

これを回避するには、パラメータを次のように設定して作成されたInflaterInputStreamパスをインスタンス化してみてください。Inflaternowraptrue

in = new InflaterInputStream(conn.getInputStream()), new Inflater(true));
于 2010-10-14T10:37:55.333 に答える
3

残念ながら、InflaterオブジェクトでInflaterInputStreamを使用しても、常に正しい解凍が行われるとは限りませんでした。ヘッダーを検出し、ペイロードへのオフセットがどこにあるかをインフレーターに伝える必要がありました。

http://thushw.blogspot.com/2014/05/decoding-html-pages-with-content.html

于 2014-05-25T18:43:05.370 に答える