import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.zip.GZIPInputStream;
public class GzipHttpFetcher {
public static String fetch(String urlStr) throws IOException {
URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("Accept-Encoding", "gzip, deflate"); // 聲明支援壓縮
conn.setRequestProperty("User-Agent", "Mozilla/5.0");
conn.connect();
InputStream is = conn.getInputStream();
// 判斷是否真的是 gzip
String encoding = conn.getContentEncoding();
if (encoding != null && encoding.contains("gzip")) {
is = new GZIPInputStream(is);
}
// 讀取解壓後的內容
try (BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"))) {
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
sb.append(line).append('\n');
}
return sb.toString();
}
}
public static void main(String[] args) throws Exception {
String html = fetch("https://example.com");
System.out.println(html.substring(0, 500));
}
}
Accept-Encoding: gzip, deflate,否則伺服器可能不壓縮直接返回明文。Content-Encoding: gzip 判斷,再包裝 GZIPInputStream。GZIPInputStream 會自動解壓,上層用 InputStreamReader 讀取字符流。UTF-8(或從 Content-Type 解析 charset)。
// OkHttp 自動處理 GZIP,無需手動代碼
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(url).build();
try (Response response = client.newCall(request).execute()) {
String html = response.body().string();
}
核心三步:**請求頭聲明支援 gzip → 判斷響應頭 Content-Encoding → 用 GZIPInputStream 解壓讀取**。手寫僅適合學習/輕量場景,實際項目請用 OkHttp/HttpClient。