URL url = new URL("https://example.com/image.jpg");
InputStream in = url.openStream(); // 可能拋出 IOException、無法處理重導向、無連線逾時控制
public static byte[] downloadImage(String urlString) throws IOException {
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(10_000); // 10 秒連線逾時
conn.setReadTimeout(30_000); // 30 秒讀取逾時
conn.setInstanceFollowRedirects(true); // 支援 301/302 重導向
conn.setRequestProperty("User-Agent", "Mozilla/5.0"); // 部分伺服器要求 UA
int responseCode = conn.getResponseCode();
if (responseCode != HttpURLConnection.HTTP_OK) {
throw new IOException("HTTP error code: " + responseCode);
}
try (InputStream in = conn.getInputStream();
ByteArrayOutputStream out = new ByteArrayOutputStream()) {
byte[] buffer = new byte[8192];
int len;
while ((len = in.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
return out.toByteArray();
} finally {
conn.disconnect(); // 釋放連線資源
}
}
| 特性 | URL.openStream() | HttpURLConnection |
|---|---|---|
| 連線逾時控制 | 無(預設無限等待) | 可設定 connect/read timeout |
| 重導向處理 | 依賴預設實作,不可控 | setInstanceFollowRedirects(true) |
| 請求標頭自訂 | 不可 | setRequestProperty() |
| 回應碼檢查 | 不可 | getResponseCode() |
| 資源釋放 | 需手動 close | disconnect() 釋放連線池 |
生產環境強烈建議使用成熟網路庫:
// OkHttp 同步下載
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(urlString).build();
try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
return response.body().bytes();
}
Thread、AsyncTask(已棄用)、ExecutorService、RxJava 或 Coroutines。<uses-permission android:name="android.permission.INTERNET"/>。res/xml/network_security_config.xml 設定 cleartextTrafficPermitted="true" 或全站 HTTPS。掌握 HttpURLConnection 完整參數配置,是理解上層網路庫運作基礎的關鍵。