http contentencoding "deflate」の処理
-
30-09-2019 - |
質問
何 inputstream タイプは、httpを持つurlconnectionストリームを処理するために使用する必要があります コンテンツエンコード に設定 デフレート?
GZIPまたはZIPのコンテンツエンコードには、gzipinputStreamを使用していますが、問題ありません。
私が使用しようとした「デフレート」のコンテンツエンコードのために InflaterInputStream と deflaterinputStream しかし、私は得ます
java.util.zip.zipexception:java.util.zip.inflaterinputStream.read(inflaterinputStream.java:147の不明な圧縮法:
私の理解では、「デフレート」エンコードは Zlib 圧縮、およびに従って ドキュメント これは、inflaterinputStreamによって処理する必要があります。
解決
HTTP/1.1で、 Content-encoding: deflate
実際には、によって定義されているように、デフレート圧縮アルゴリズムを指します RFC 1951, 、ZLIBデータ形式に包まれています。 RFC 1950.
ただし、一部のベンダーは、RFC 1950(ZLIBヘッダーなし)を完全に無視して、定義されたRFC 1951としてDEFLATEアルゴリズムを実装するだけです。
他の人は同じ問題に見舞われています:
これを回避するために、 InflaterInputStream
渡します Inflater
それはで作成されました nowrap
に設定されたパラメーター true
:
in = new InflaterInputStream(conn.getInputStream()), new Inflater(true));
他のヒント
残念ながら、インフル型のストリームをインフレーターオブジェクトで使用すると、必ずしも正しい減圧が生じるとは限りませんでした。ヘッダーを検出し、ペイロードのオフセットがどこにあるかをインフレーターに伝える必要がありました。
http://thushw.blogspot.com/2014/05/decoding-html-with-content.html