java.net.URL
類將 URL 地址進行了封裝,並提供瞭解析 URL 地址的基本方法,好比獲取 URL 的主機名和端口號。java.net.URLConnection
則表明了應用程序和 URL 之間的通訊連接,可用於讀取和寫入此 URL 引用的資源。html
URLConnection 看起來只是比 URL 多了一個 Connection,它們之間的關係也僅限於此嗎?java
爲了搞清楚什麼是 URL,須要引入另外兩個概念 URI 和 URN。編程
什麼鬼,URL 都沒搞清楚,又來兩個搞不清楚的?別擔憂,我能像變了魔法同樣讓你們把三個都搞清楚。緩存
它們之間的關係以下圖所示:安全
這圖啥意思啊,怎麼辦呢?張小敬有問題就去問葛佬,咱不會就去問「維基百科」啊。網絡
URI 能夠分爲 URL 和 URN,或者是 URL 和 URN 的結合體(同時具有 Locator 和 Name)。URN 就好像一我的的名字,URL 就像一我的的地址。換句話說:URN 肯定了身份,URL 提供了找到它的方式。編碼
概念清晰了吧?URI 是一個純粹的句法結構,用於指定標識 Web 資源的字符串的各個不一樣部分。URL 是 URI 的一個特例,包含了定位 Web 資源的足夠多的信息。URI 是統一資源標識符,而 URL 是統一資源定位符。URL 是 URI 的一種,好比:www.itmind.net/。但不是全部的 URI 都是 URL,由於 URI 可能包括一個子集,即統一資源名稱 (URN,命名了資源但不指定如何定位資源),好比說:mailto:qing_gee@163.com。url
吧啦吧啦說這麼多挺累的,來一發實例吧,用於獲取 URL 的主機名和端口號。spa
URL url = new URL("http://www.itmind.net/category/payment-selection/zhishixingqiu-jingxuan/");
System.out.println("host: " + url.getHost());
System.out.println("port: " + url.getPort());
System.out.println("uri_path: " + url.getPath());
// 輸出
// host: www.itmind.net
// port: -1
// uri_path: /category/payment-selection/zhishixingqiu-jingxuan/
複製代碼
1)建立 java.net.URL
對象的方法很是簡單,只須要一行代碼。.net
URL url = new URL(URL地址);
複製代碼
URL 對象是不可變的,由於 URL 類是 final 類型的,這樣的好處就是保證它是"線程安全"的。
2)有了 java.net.URL
對象後,就能夠獲取 URL 相關的主機名、端口、路徑等等。
url.getHost()
url.getPort()
url.getPath()
複製代碼
URLConnection 是一個抽象類,表明應用程序和 URL 之間的通訊連接。它的實例可用於讀取和寫入此 URL 引用的資源。該類提供了比 Socket 類更易於使用、更高級的網絡鏈接抽象。
怎麼獲取 URLConnection 對象呢?經過 URL 對象的 openConnection()
方法,示例以下。
URL url = new URL("http://www.itmind.net");
URLConnection connection = url.openConnection();
複製代碼
若是 URL 協議爲 HTTP 的話,返回的鏈接爲 URLConnection 的子類 HttpURLConnection。
有了 URLConnection
對象後,能夠經過 getInputStream()
返回一個 InputStream,由此讀取 URL 所引用的資源數據(若是讀取 ASCII 文本則爲 ASCII;若是讀取 HTML 文件則爲原始 HTML,若是讀取圖像文件則爲二進制圖片數據等)。
咱們來嘗試讀取一下小白學堂首頁的內容,代碼示例以下。
URL url = new URL("http://www.itmind.net");
URLConnection connection = url.openConnection();
try (InputStream in = connection.getInputStream();) {
ByteArrayOutputStream output = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while ((len = in.read(buffer)) != -1) {
output.write(buffer, 0, len);
}
System.out.println(new String(output.toByteArray()));
} catch (IOException e) {
e.printStackTrace();
}
複製代碼
可使用 try-with-resource
獲取 InputStream
,該類實現了 AutoCloseable
接口,能夠在內容讀取完畢後自動關閉輸入流。
打印的內容以下圖所示(部分):
若是你想讀取某個 URL 的內容,上述方法是一個不錯的方案,趕快去試試吧!
URL 和 URLConnection 最大的不一樣在於:
獲取 HTTP 頭部的方法有如下一些:
getContentType,返回 Content-type 頭字段的值,即數據的 MIME 內容類型。若類型不可用,則返回 null。若是內容類型是文本,則 Content-type 首部可能會包含一個標識內容編碼方式的字符集,例如:Content-type:text/html; charset=UTF-8
getContentLength(),返回 Content-length 頭字段的值,即內容的字節數。
getContentEncoding(),返回 Content-encoding 頭字段的值,即內容的編碼方式(不一樣於字符編碼方式),例如:x-gzip。
getDate(),返回 date 頭字段的值,即請求的發送時間。
getExpiration(),返回 expires(過時時間) 頭字段的值。若是返回 0,表示不過時,永遠緩存。
getLastModified(),返回 last-modified(上次修改日期) 頭字段的值。
代碼示例以下。
URL url = new URL("http://www.itmind.net");
URLConnection connection = url.openConnection();
System.out.println(connection.getContentType());
System.out.println(connection.getContentLength());
System.out.println(connection.getContentEncoding());
System.out.println(connection.getDate());
System.out.println(connection.getExpiration());
System.out.println(connection.getLastModified());
// 輸出
// text/html; charset=UTF-8
// -1
// null
// 1566886980000
// 0
// 0
複製代碼
公衆號後臺回覆「666」獲取精心爲你準備的高清帶書籤的 PDF——《Java 網絡編程(第4版)》。