利用 URL 和 HttpURLConnection 發起 GET 請求獲取圖片輸入流,再通過緩衝流高效寫入本地文件。
public class HttpURLConnectionUtil {
/** 發送 GET 請求獲取輸入流 */
public static InputStream getInputStreamByGet(String urlStr) {
try {
HttpURLConnection conn = (HttpURLConnection) new URL(urlStr).openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
return conn.getInputStream();
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/** 將輸入流保存到文件 */
public static void saveData(InputStream is, File destFile) {
try (BufferedInputStream bis = new BufferedInputStream(is);
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile))) {
byte[] buffer = new byte[1024];
int len;
while ((len = bis.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
bos.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class Test {
public static void main(String[] args) {
String imgUrl = "https://img.coocaa.com/www/attachment/forum/201602/16/085938u86ewu4l8z6flr6w.jpg";
// 從 URL 提取文件名
String fileName = imgUrl.substring(imgUrl.lastIndexOf('/') + 1);
File destFile = new File("f:/", fileName); // 保存至 F 盤
InputStream is = HttpURLConnectionUtil.getInputStreamByGet(imgUrl);
if (is != null) {
HttpURLConnectionUtil.saveData(is, destFile);
System.out.println("下載完成:" + destFile.getAbsolutePath());
} else {
System.err.println("下載失敗:無法獲取輸入流");
}
}
}
BufferedInputStream/OutputStream 減少系統調用次數。Content-Disposition 頭或生成 UUID 命名。FileChannel) 提升吞吐。url.openStream():快捷獲取輸入流,等價於 url.openConnection().getInputStream()。URLClassLoader:動態加載遠程 JAR/類文件。