天天看點

java實作html網頁的gzip解壓

在對網頁抓包中發現,傳回的很多網頁是經過壓縮的,比如通路谷歌首頁,傳回的頭檔案中包含Content-Encoding gzip

使用gzip可以省下很多網頁流量,在網速一定的情況下,可以提高通路效率,我們用java通路時如何可以得到gzip的傳回,并且我們如何解析傳回的gzip呢?

我們以通路http://www.baidu.com/為例

我們用URL的openStream方法直接通路時并不傳回gzip壓縮資料,這是因為時候傳回gzip需要判斷浏覽器是否支援gzip壓縮,是以我們請求資料的時候在http請求頭中添加支援gzip的請求頭就可以

添加conn.setRequestProperty(“Accept-Encoding”, “gzip,deflate”);就告訴伺服器你的浏覽器支援gzip解壓了

URL url = new URL("http://www.baidu.com/");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("Accept-Encoding", "gzip,deflate");
conn.connect();

InputStream in = conn.getInputStream();

BufferedReader bin = new BufferedReader(new InputStreamReader(in, "GB2312"));
String s = null;
while((s=bin.readLine())!=null){
	System.out.println(s);
}
bin.close();
           

沒有conn.setRequestProperty(“Accept-Encoding”, “gzip,deflate”);不會出現亂碼

加上conn.setRequestProperty(“Accept-Encoding”, “gzip,deflate”);就是亂碼,這事因為伺服器對傳回内容進行了gzip壓縮的緣故,我們隻要判斷傳回頭是否包含Content-Encoding gzip,就可以判斷是不是壓縮過的資料,對待壓縮後的資料我們隻需進行gzip解壓就好了

隻需将上面的代碼加上
GZIPInputStream gzin = new GZIPInputStream(in);
并将
BufferedReader bin = new BufferedReader(new InputStreamReader(in, "GB2312"));
改為
BufferedReader bin = new BufferedReader(new InputStreamReader(gzin, "GB2312"));
           

當然是否需要gzip解壓,隻判斷傳回資料頭是否包含Content-Encoding gzip就可以了

轉自:http://www.codeif.com/topic/446