Java 什麼是URL?及URL類和URLConnection類

2020-07-16 10:04:36
在 Java 的 API 中的 java.net 包中包含一個 URL 類和一個 URLConnection 類。下面介紹這兩個類的相關知識。

URL 概念

URL 是統一資源定位符(Uniform Resource Locator)的簡稱,它表示 Internet 上某一資源的地址。通過 URL 使用者可以存取各種網路資源,比如常見的 WWW 以及 FTP 站點。瀏覽器可以通過解析給定的 URL 在網路上查詢相應的檔案或其他資源。

URL 的語法格式如下所示。
protocol://resourceName

協定名(protocol)指明獲取資源所使用的傳輸協定,如 HTTP、FTP 和 file 等,資源名(resourceName)則應該是資源的完整地址,包括主機名、埠號、檔名或檔案內部的一個參照。下面是一些簡單的 URL 範例。
http://www.sun.com/    協定名://主機名
http://localhost:8080/Test/admin/login.jsp 協定名://機器名:埠號/檔名

URL 類

在 java.net 包中包含專門用來處理 URL 的類 URL,可以獲得 URL 的相關資訊,例如 URL 的協定名和主機名等。下面分別對它的構造方法和常用方法進行介紹。

URL 的構造方法如表 1 所示。
表1 URL 的構造方法
構造方法 說明
public URL (String spec) 通過一個表示 URL 地址的字串可以構造一個 URL 物件。
public URL(URL context,String spec) 使用基本地址和相對 URL 構造一個 URL 物件。
public URL(String protocol,String host,String file) 使用指定的協定、主機名和檔名建立一個 URL 物件。
public URL(String protocol,String host,int port,String file) 使用指定的協定、主機名、埠號和檔名建立一個 URL 物件。

URL 的常用方法如表 2 所示。
表2 URL 的常用方法
方法 說明
public String getProtocol() 獲取該 URL 的協定名。
public String getHost() 獲取該 URL 的主機名。
public int getPort() 獲取該 URL 的埠號,如果沒有設定埠,返回 -1。
public String getFile() 獲取該 URL 的檔名。
public String getRef() 獲取該 URL 在檔案中的相對位置。
public String getQuery() 獲取該 URL 的查詢資訊。
public String getPath() 獲取該 URL 的路徑。
public String getAuthority() 獲取該 URL 的許可權資訊。
public String getUserInfo() 獲得使用者的資訊。
public String getRef() 獲得該 URL 的錨點。

URLConnection 類

完成了 URL 的定義,接下來就可以獲得 URL 的通訊連線。在 java.net 包中,定義了專門的 URLConnection 類來表示與 URL 建立的通訊連線,URLConnection 類的物件使用 URL 類的 openConnection() 方法獲得。

URLConnection 類的主要方法如表 3 所示。
表3 URLConnection 類的主要方法
方法 說明
void addRequestProperty(String key,String value) 新增由鍵值對指定的一般請求屬性。key 指的是用於識別請求的關鍵字
(例如 accept),value 指的是與該鍵關聯的值。
void connect() 開啟到此 URL 所參照的資源的通訊連結(如果尚未建立這樣的連結)。
Object getConnection() 檢索此 URL 連結的內容。
InputStream getInputStream() 返回從此開啟的連結讀取的輸入流。
OutputStream getOutputStream() 返回寫入到此連結的輸出流。
URL getURL() 返回此 URLConnection 的 URL 欄位的值。

例 1

使用 URL 和 URLConnection 類獲取與百度首頁的連結並將其頁面資訊輸出到控制台,主要步驟如下所示。

(1) 建立一個類,編寫 main() 方法,在該方法中建立一個 URL 物件,然後傳入引數“http://www.baidu.com/”,輸出 URL 的相關資訊,程式碼如下所示。
package ch16;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
public class URLDemo
{
    public static void main(String[] args)
    {
        try
        {
            URL url=new URL("http://www.baidu.com/");
            System.out.println("協定:" + url.getProtocol());
            System.out.println("主機:" + url.getHost());
            System.out.println("埠:" + url.getPort());
            InputStream in;
        }
        catch(IOException e)
        {
            //TODO 自動生成的 catch 塊
            e.printStackTrace();
        }
    }
}

(2) 在 main() 方法的 try 模組中繼續新增程式碼,獲得 URLConnection 物件,通過輸入流讀取頁面原始碼並將資訊輸出到控制台,程式碼如下所示。
URLConnection uc=url.openConnection();
in=uc.getInputStream();
byte[] b=new byte[1024];
int len;
while((len=in.read(b))!=-1)
{
    System.out.println(new String(b,0,len));
}
in.close();

(3) 執行程式,執行結果如下所示。
協定:http
主機:www.baidu.com
埠:-1
<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=https://s3.ap-northeast-1.wasabisys.com/img.tw511.com/202007/errore0antsmdgbj.html> </p> </div> </div> </div> </body> </html>

提取 URL 協定名稱

我們知道 URL 中必須有一個協定名稱,常用的協定有 HTTP、HTTPS 和 FTP 等。本範例將允許使用者輸入一個 URL,然後從中提取出協定名稱。

範例程式碼如下:
package ch16;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Scanner;
public class URLDemo1
{
    public static void main(String[] args)
    {
        try
        {
            Scanner scan=new Scanner(System.in);    //建立輸入掃描器
            System.out.println("請輸入一個完整的網址:");
            String line=scan.nextLine();    //獲取使用者輸入文字
            URL url=new URL(line);    //建立URL物件
            System.out.println("這個網址的主機名稱是:"+url.getHost());    //獲取主機名稱
            System.out.println("這個網址的URL協定名稱是:"+url.getProtocol());    //獲取協定名稱
        }
        catch(MalformedURLException e)
        {
            System.out.println("輸入的是非法網址");    //提示錯誤資訊
        }
    }
}

如上述程式碼所示,在建立一個 URL 類物件之後呼叫 getHost() 方法獲取主機名稱,呼叫 getPmtocol() 方法獲取協定名稱。範例執行結果如下所示。
請輸入一個完整的網址:
http://www.baidu.com
這個網址的主機名稱是:www.baidu.com
這個網址的URL協定名稱是:http
請輸入一個完整的網址:
ftp://www.baidu.com/seo
這個網址的主機名稱是:www.baidu.com
這個網址的URL協定名稱是:ftp