首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java URL 類深度解析:資源定位、流式讀取與本地保存實戰

     編輯:Java 綜合教學

URL 類核心 API、網頁源碼獲取與異常處理全攻略

java.net.URL 代表統一資源定位符,是 Java 網絡編程的入口類。本文通過實例講解 URL 組件解析、openStream() 讀取遠程資源、openConnection() 進階控制(如下載二進制文件)、編碼處理與常見陷阱。

一、URL 組件拆解

URL url = new URL("https://www.cnblogs.com/gode/p/5812013.html");

System.out.println("協議: " + url.getProtocol());   // http
System.out.println("主機: " + url.getHost());       // www.cnblogs.com
System.out.println("端口: " + url.getPort());       // -1 (默認端口)
System.out.println("路徑: " + url.getPath());       // /gode/p/5812013.html
System.out.println("文件: " + url.getFile());       // /gode/p/5812013.html
System.out.println("錨點: " + url.getRef());        // null
System.out.println("查詢: " + url.getQuery());      // null

二、讀取網頁源碼(HTML 文本)

public static String fetchHtml(String urlString) throws IOException {
    URL url = new URL(urlString);
    try (InputStream is = url.openStream();
         BufferedReader reader = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) {
        StringBuilder sb = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) {
            sb.append(line).append('\n');
        }
        return sb.toString();
    }
}

輸出為完整 HTML 源碼(含標籤、JS、CSS 引用),而非渲染後的可視文本。

三、下載二進制文件(圖片、PDF、Excel 等)

url.openStream() 返回原始字節流,適用於文本;若需處理重定向、設置請求頭、獲取 Content-Type/Content-Length,應使用 URLConnection:

public static void downloadFile(String urlString, String destPath) throws IOException {
    URL url = new URL(urlString);
    URLConnection conn = url.openConnection();
    // 可選:模擬瀏覽器 User-Agent,防 403
    conn.setRequestProperty("User-Agent", "Mozilla/5.0");

    try (InputStream is = conn.getInputStream();
         FileOutputStream fos = new FileOutputStream(destPath)) {

        byte[] buffer = new byte[8192];
        int len;
        while ((len = is.read(buffer)) != -1) {
            fos.write(buffer, 0, len);
        }
        System.out.println("下載完成: " + destPath);
    }
}

四、實戰案例:將博客頁面保存為本地 HTML

public class UrlDemo {
    public static void main(String[] args) {
        String blogUrl = "https://www.cnblogs.com/gode/p/5812013.html";
        String localFile = "blog_backup.html";

        try {
            // 方式 1:直接 openStream
            // downloadFile(blogUrl, localFile);

            // 方式 2:URLConnection 顯式控制
            URL url = new URL(blogUrl);
            URLConnection conn = url.openConnection();
            conn.setRequestProperty("User-Agent", "Mozilla/5.0");

            try (InputStream is = conn.getInputStream();
                 FileOutputStream fos = new FileOutputStream(localFile)) {
                byte[] buf = new byte[1024];
                int n;
                while ((n = is.read(buf)) != -1) {
                    fos.write(buf, 0, n);
                }
            }
            System.out.println("保存成功,打開 " + localFile + " 即可查看完整頁面結構。");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

五、常見異常與處理

異常原因對策
MalformedURLExceptionURL 字符串格式錯誤(如缺協議、非法字符)捕獲異常,校驗輸入;使用 URI 類預解析
UnknownHostExceptionDNS 解析失敗檢查網絡/域名;捕獲後重試或降級
ConnectException連接超時/拒絕設置連接超時 conn.setConnectTimeout(5000)
SocketTimeoutException讀取超時設置讀取超時 conn.setReadTimeout(10000)
FileNotFoundException (HTTP 404)資源不存在檢查 URL;捕獲後記錄日誌

六、最佳實踐清單

  1. 始終指定編碼:new InputStreamReader(is, StandardCharsets.UTF_8) 或根據 conn.getContentEncoding() 動態判斷。
  2. 設置超時:防止線程無限阻塞,setConnectTimeout/setReadTimeout。
  3. 關閉資源:使用 try-with-resources 確保流關閉。
  4. 大文件流式處理:邊讀邊寫,避免全量載入內存 OOM。
  5. 尊重 robots.txt & 限流:爬蟲場景需合規。

七、總結

URL 類提供輕量級網絡資源訪問能力:openStream() 適合簡單文本獲取;openConnection() 解鎖完整 HTTP 控制(請求頭、重定向、響應碼、緩存)。掌握流式讀寫、編碼處理、異常捕獲與超時控制,是 Java 網絡編程的基本功。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved