Java 必知必會的 URL 和 URLConnection

語言: CN / TW / HK

theme: vuepress highlight: atom-one-dark


java.net.URL 類將 URL 地址進行了封裝,並提供瞭解析 URL 地址的基本方法,比如獲取 URL 的主機名和埠號。java.net.URLConnection 則代表了應用程式和 URL 之間的通訊連結,可用於讀取和寫入此 URL 引用的資源。

  • URI = Universal Resource Identifier,中文釋義為統一資源標誌符
  • URL = Universal Resource Locator,中文釋義為統一資源定位符
  • URN = Universal Resource Name,中文釋義為統一資源名稱

URI 可以分為 URL 和 URN,或者是 URL 和 URN 的結合體(同時具備 Locator 和 Name)。URN 就好像一個人的名字,URL 就像一個人的地址。換句話說:URN 確定了身份,URL 提供了找到它的方式。

URL其實是一種資源

URL代表的是一種資源,它使用的是統一資源定位格式,形如:https://juejin.cn, 其實我們還可以用URL來構造物件的,使用字串嗎?不是的,java中有大量的建構函式允許使用一個個的分串來指定URL,有了URL物件就可以通過幾個不用的方法來獲取URL對應的內容,沒錯,我說的就是網頁:

java import java.net.*; import java.io.*; public class IntTest{ public static void main(String [] args) throws Exception{ URL url = new URL(args[0]); InputStream html = url.openStream(); int c; do{ c = html.read(); if(c != -1){ System.out.print((char) c); } }while(c != -1); } }

或許,這是你之前沒有聽說過的:URLConnection

一般靜態的操作就都是很容易的,使用一個URL物件讀取一個URL簡直不要太容易,剛才說的靜態是我自己起的,其實並沒有這個說法,而是我聯想到資料結構,像讀取這樣的操作都是靜態的 ,於是我在這裡也算是做相同的比喻;

如果你想對HTTP事務做更多的控制呢?,比如說我們肯定需要往伺服器提交一些資料,需要URL物件的 openConnection 函式,這個函式可以返回一個 URLConnection 物件,如果URL使用了HTTP協議,那麼URLConnection 物件會返回一個URLConnection的子類:HttpURLConnection;

java import java.net.*; import java.io.*; public class Handin{ public static void main(String [] args) throws Exception{ URL url=new URL(""http//com.aaaaa.com"");//網址瞎編的 HttpURLConnection con=(HttpURLConnection)url.openConnection(); int c; con.setDoInput(true); con.setDoOutput(true); con.setrequestMethod("POST"); con.setRequestProperty("Content-type","application/X-WWW-form-urlencoded"); con.connect(); PrintWriter pri=new PrintWriter{ new OutputStreamWriter{con.getOutputStream(),"12321",true} pri.print("sasd"+URLEncoder.encode(args[0]+'dasda')); pri.flush(); System.out.println(con.getResponseMessage()); InputStream in=con.getInputStream(); do{ char x; c=in.read(); x=(char)c; if(c!=-1){ System.out.print(x); } }while(c!=-1); } }

關於HttpURLConnection,獲取HttpURLConnection物件只能是用 http://URL (注意我這裡只是寫了一個格式而已)來建立,並呼叫HttpURLConnection物件的openConnection函式,然後把返回的URLConnection值賦給HttpURLConnection。

誰是幕後推手?

URL和URLConnection都是指派URLStreamHandler和URLConnection來幹活,經過封裝之後,URL物件會檢查他的URL協議埠,然後呼叫URLStreamHandlerFactory的一個物件,這個物件主要用於建立URLStreamHandler子類,使得與指定的協議相符合;

子類URLStreamHandler建立一個相應的URLConnection物件,也解析URL,這樣你可以定義使用者化URL格式,物件URLConnection通常都是和伺服器打交道的。

```java import java.net.; import java.io.; public class TimeURLConnection extends URLConnection{ private Socket con; public final static int de=13; public TimeURLConnection void connect() throws IOException{ if(!=connected){ int port=url.getPort(); if(port<0) port=de; con=new Socket(url.getHost(),port); connected=true; } }

public synchronized InputStream getInputStream() throws IOException{
    connect();
    return con.getInputStream();
}

} ```