在對網頁抓包中發現,傳回的很多網頁是經過壓縮的,比如通路谷歌首頁,傳回的頭檔案中包含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