iT邦幫忙

2025 iThome 鐵人賽

DAY 5
0
自我挑戰組

從0開始學習Java系列 第 5

java.net 範例實作-URL及HttpURLConnection類別

  • 分享至 

  • xImage
  •  

一、範例實作-使用URL及HttpURLConnection類別,讀入寫出純文字網頁

package ch14;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.StandardCharsets;

public class Test1 {
	public static void main(String args[]) throws Exception {
		URL url = new URI("https://hackmd.io/s/tutorials-tw").toURL();

		HttpURLConnection connection = (HttpURLConnection) url.openConnection();
		final int statusCode = connection.getResponseCode();
		if (statusCode == 200) {
			try (InputStream is = connection.getInputStream();
					InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8);
					BufferedReader br = new BufferedReader(isr);) { 
                    // BufferedReader 專門處理純文字資料,用來讀出純文字
				String line;
				while ((line = br.readLine()) != null) { // 使用BufferedReader內的readLine()方法
					System.out.println(line);
				}
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				connection.disconnect();
			}
		}

	}
}

二、範例解說

  1. 使用java.net API的URL類別及HttpURLConnection類別,來做這個範例。
  2. 使用try-with-resources會將實作Closable介面的類別,例如InputStreamReader, InputStreamReader, BufferedReader等,賦予執行完即會自動關閉的功能。
  3. InputStream將網頁以位元組方式讀入。
  4. InputStreamReader 的工作是「解碼 (decode)」:byte → char。將位元組轉成字元。相反地,OutputStreamWriter 的工作是「編碼 (encode)」:char → byte。所以,InputStreamReader不可省略。
  5. BufferedReader接收 字元流Reader),不是位元組(InputStream)。在上面的範例,BufferedReader負責接收InputStreamReader物件。
  6. BufferedReader即為加上緩衝區Buffer的資料讀入方式,速度會比較快。
  7. HttpURLConnection請記得關閉,建議可以在try-with-resources的finally內加上connection.disconnect();,如範例。

三、補充

  1. JDK 18+ 後,雖然支援預設編碼為UTF-8,如果InputStreamReader方法後面沒有帶入類似StandardCharsets.UTF_8等編碼參數資料,會預設使用UTF-8編譯。
  2. I/O資料流轉換流程圖
   [網路/檔案資料]
            │
            ▼
      InputStream
   (位元組流: byte[])
   ──────────────────────────────
   這裡讀到的是原始二進位資料,例如:
   0xE6 0xB8 0xAC 0xE8 0xA9 0xA6 ...
   ──────────────────────────────
            │ (需要文字編碼解碼)
            ▼
    InputStreamReader
   (位元組流 → 字元流)
   ──────────────────────────────
   把 byte[] 依指定編碼 (UTF-8/Big5...)
   解碼成 Java char (UTF-16)
   例如:
   '測' '試' ...
   ──────────────────────────────
            │ (字元流)
            ▼
     BufferedReader
   (加緩衝 + 便利方法)
   ──────────────────────────────
   提供 readLine(),一次讀取整行文字
   讓程式處理更方便
   ──────────────────────────────
            │
            ▼
       [Java String]

參考資料
https://hackmd.io/s/tutorials-tw
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/net/package-summary.html
https://docs.oracle.com/en/java/javase/20/migrate/preparing-migration.html?utm_source=chatgpt.com


上一篇
java.net範例
下一篇
使用 Java HttpURLConnection 下載網頁內容
系列文
從0開始學習Java21
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言