鴻蒙OS URI

2022-06-14 16:23 更新

URI

java.lang.Object

|---java.net.URI

public final class URI
extends Object
implements Comparable<URI>, Serializable

表示統(tǒng)一資源標識符 (URI) 引用。

除了下面提到的一些小偏差之外,此類的一個實例表示由 RFC 2396 定義的 URI 引用:統(tǒng)一資源標識符 (URI):通用語法,由 RFC 2732 修訂:URL 中文字 IPv6 地址的格式。 Literal IPv6 地址格式也支持 scope_ids。 此處描述了 scope_ids 的語法和用法。 此類提供了用于從其組件或通過解析其字符串形式創(chuàng)建 URI 實例的構造函數(shù)、用于訪問實例的各種組件的方法,以及用于規(guī)范化、解析和相對化 URI 實例的方法。 此類的實例是不可變的。

URI 語法和組件 在最高級別,字符串形式的 URI 引用(以下簡稱“URI”)具有以下語法

[scheme:]scheme-specific-part[#fragment]

其中方括號 [...] 描述可選組件,字符 : 和 # 代表它們自己。

絕對 URI 指定方案; 一個非絕對的 URI 被稱為是相對的。 URI 還根據(jù)它們是不透明的還是分層的進行分類。

不透明 URI 是絕對 URI,其特定于方案的部分不以斜杠字符 ('/') 開頭。 不透明的 URI 不受進一步解析的影響。 不透明 URI 的一些示例是:

分層 URI 要么是絕對 URI,其特定于方案的部分以斜杠字符開頭,要么是相對 URI,即不指定方案的 URI。 分層 URI 的一些示例是:

http://java.sun.com/j2se/1.3/ docs/guide/collections/designfaq.html#28 ../../../demo/jfc/SwingSet2/src/SwingSet2.java file:///~/calendar

分層 URI 需要根據(jù)語法進行進一步解析

scheme:path[#fragment]

其中字符 :、/、? 和 # 代表它們自己。 分層 URI 的特定于方案的部分由方案和片段組件之間的字符組成。

如果指定,分層 URI 的權限組件是基于服務器的或基于注冊表的。 基于服務器的權限根據(jù)熟悉的語法進行解析

[user-info@]host[:port]

其中字符 @ 和 : 代表它們自己。目前使用的幾乎所有 URI 方案都是基于服務器的。不以這種方式解析的權限組件被認為是基于注冊表的。

如果分層 URI 的路徑組件以斜杠字符 ('/') 開頭,則它本身就是絕對的;否則是相對的。分層 URI 的路徑要么是絕對的,要么是指定權限的,它始終是絕對的。

總而言之,一個 URI 實例有以下九個組成部分:

在給定的實例中,任何特定組件要么未定義,要么具有不同的值。未定義的字符串組件由 null 表示,而未定義的整數(shù)組件由 -1 表示??梢詫⒆址M件定義為將空字符串作為其值;這不等于未定義該組件。

特定組件是否在實例中定義取決于所表示的 URI 的類型。絕對 URI 有一個方案組件。一個不透明的 URI 有一個方案、一個特定于方案的部分,可能還有一個片段,但沒有其他組件。分層 URI 總是有一個路徑(盡管它可能是空的)和一個特定于方案的部分(至少包含路徑),并且可能有任何其他組件。如果權限組件存在并且是基于服務器的,那么將定義主機組件并且可以定義用戶信息和端口組件。

URI 實例上的操作 此類支持的關鍵操作是規(guī)范化、解析和相對化。

規(guī)范化是刪除不必要的“?!钡倪^程。和“..”來自分層 URI 的路徑組件的段。每個 ”?!倍伪缓唵蔚貏h除。僅當“..”段前面有非“..”段時,才會刪除“..”段。規(guī)范化對不透明的 URI 沒有影響。

解析是根據(jù)另一個基本 URI 解析一個 URI 的過程。生成的 URI 以 RFC 2396 指定的方式由兩個 URI 的組件構成,從原始 URI 中獲取未指定的組件。對于分層 URI,原始路徑會根據(jù)基路徑解析,然后進行規(guī)范化。例如:

docs/guide/collections/designfaq.html#28 (1)

針對基礎 URI http://java.sun.com/j2se/1.3/ 是結果 URI

https://docs.oracle.com/javase/1.3/docs/guide/collections/designfaq.html#28

解析相對 URI

../../../demo/jfc/SwingSet2/src/SwingSet2.java (2)

反過來,與這個結果相反,

http://java.sun.com/j2se/1.3/demo/jfc/SwingSet2/src/SwingSet2.java

支持對絕對和相對 URI 的解析,以及在分層 URI 的情況下對絕對和相對路徑的解析。 根據(jù)任何其他 URI 解析 URI file:///~calendar 只會產(chǎn)生原始 URI,因為它是絕對的。 將上面的相對 URI (2) 與相對基本 URI (1) 解析會產(chǎn)生規(guī)范化但仍然是相對的 URI

demo/jfc/SwingSet2/src/SwingSet2.java

最后,相對化是解析的倒數(shù):對于任何兩個標準化的 URI u 和 v,

u.relativize(u.resolve(v)).equals(v) and u.resolve(u.relativize(v)).equals(v) .

在構建包含 URI 的文檔時,此操作通常很有用,這些 URI 必須盡可能與文檔的基本 URI 相關。 例如,將 URI 相對化

https://docs.oracle.com/javase/1.3/docs/guide/index.html

針對基礎 URI

http://java.sun.com/j2se/1.3

產(chǎn)生相對 URI docs/guide/index.html。 字符類別 RFC 2396 準確地指定了在 URI 引用的各種組件中允許使用的字符。 以下類別(其中大部分來自該規(guī)范)用于描述這些約束:

所有合法 URI 字符的集合由未保留、保留、轉義和其他字符組成。

轉義八位組、引用、編碼和解碼 RFC 2396 允許轉義八位組出現(xiàn)在用戶信息、路徑、查詢和片段組件中。 轉義在 URI 中有兩個目的:

  • 在要求 URI 嚴格遵守 RFC 2396 時,對非 US-ASCII 字符進行編碼,不包含任何其他字符。
  • 引用組件中非法的字符。用戶信息、路徑、查詢和片段組件在哪些字符被視為合法和非法方面略有不同。

這些目的在此類中通過三個相關操作來實現(xiàn):

  • 通過將字符替換為在 UTF-8 字符集中表示該字符的轉義八位字節(jié)序列來對字符進行編碼。例如,歐元貨幣符號 ('\u20AC') 編碼為“%E2%82%AC”。 (偏離 RFC 2396,它沒有指定任何特定的字符集。)
  • 通過編碼簡單地引用非法字符。例如,空格字符通過將其替換為“%20”來引用。 UTF-8 包含 US-ASCII,因此對于 US-ASCII 字符,此轉換具有 RFC 2396 所要求的效果。
  • 通過將轉義的八位字節(jié)序列替換為它在 UTF-8 字符集中表示的字符序列來解碼它。 UTF-8 包含 US-ASCII,因此解碼具有取消引用任何引用的 US-ASCII 字符以及解碼任何編碼的非 US-ASCII 字符的效果。如果在解碼轉義的八位字節(jié)時發(fā)生解碼錯誤,則錯誤的八位字節(jié)將替換為 '\uFFFD',Unicode 替換字符。

這些操作在該類的構造函數(shù)和方法中暴露如下:

  • 單參數(shù)構造函數(shù)要求在其參數(shù)中引用任何非法字符,并保留任何轉義的八位字節(jié)和其他存在的字符。
  • 多參數(shù)構造函數(shù)根據(jù)它們出現(xiàn)的組件的要求引用非法字符。這些構造函數(shù)始終引用百分比字符 ('%')。保留任何其他字符。
  • getRawUserInfo、getRawPath、getRawQuery、getRawFragment、getRawAuthority 和 getRawSchemeSpecificPart 方法以原始形式返回其對應組件的值,而不解釋任何轉義的八位字節(jié)。這些方法返回的字符串可能同時包含轉義的八位字節(jié)和其他字符,并且不會包含任何非法字符。
  • getUserInfo、getPath、getQuery、getFragment、getAuthority 和 getSchemeSpecificPart 方法解碼其相應組件中的任何轉義八位字節(jié)。這些方法返回的字符串可能同時包含其他字符和非法字符,并且不會包含任何轉義的八位位組。
  • toString 方法返回一個包含所有必要引號但可能包含其他字符的 URI 字符串。
  • toASCIIString 方法返回不包含任何其他字符的完全引用和編碼的 URI 字符串。

身份 對于任何 URI u,總是這樣

new URI(u.toString()).equals(u) .

對于任何不包含冗余語法的 URI u,例如空權限前的兩個斜杠(如 file:///tmp/ 中)或主機名后的冒號但沒有端口(如 http://java.sun. com: ),并且除了必須引用的字符之外不編碼字符,以下標識也成立:

     new URI(u.getScheme(),
             u.getSchemeSpecificPart(),
             u.getFragment())
     .equals(u)

在所有情況下,

     new URI(u.getScheme(),
             u.getUserInfo(), u.getAuthority(),
             u.getPath(), u.getQuery(),
             u.getFragment())
     .equals(u)

如果你是分層的,并且

     new URI(u.getScheme(),
             u.getUserInfo(), u.getHost(), u.getPort(),
             u.getPath(), u.getQuery(),
             u.getFragment())
     .equals(u)

如果 u 是分層的并且沒有權限或基于服務器的權限。 URI、URL 和 URN URI 是統(tǒng)一資源標識符,而 URL 是統(tǒng)一資源定位符。因此,抽象地說,每個 URL 都是一個 URI,但并不是每個 URI 都是一個 URL。這是因為有另一個 URI 子類別,統(tǒng)一資源名稱 (URN),它命名資源但不指定如何定位它們。上面顯示的 mailto、news 和 isbn URI 是 URN 的示例。

URI 和 URL 之間的概念區(qū)別體現(xiàn)在此類和 URL 類之間的差異上。

此類的實例表示 RFC 2396 定義的句法意義上的 URI 引用。URI 可以是絕對的,也可以是相對的。 URI 字符串根據(jù)通用語法進行解析,而不考慮它指定的方案(如果有)。不執(zhí)行主機查找(如果有的話),也不構造依賴于方案的流處理程序。相等、散列和比較是根據(jù)實例的字符內(nèi)容嚴格定義的。換句話說,URI 實例只不過是一個結構化的字符串,它支持比較、規(guī)范化、解析和相對化的語法、與方案無關的操作。

相比之下,URL 類的實例表示 URL 的句法組件以及訪問它所描述的資源所需的一些信息。 URL 必須是絕對的,也就是說,它必須始終指定一個方案。 URL 字符串根據(jù)其方案進行解析。始終為 URL 建立流處理程序,實際上不可能為沒有可用處理程序的方案創(chuàng)建 URL 實例。相等和散列取決于主機的方案和 Internet 地址(如果有);比較沒有定義。換句話說,URL 是一個結構化的字符串,它支持解析的語法操作以及查找主機和打開到指定資源的連接的網(wǎng)絡 I/O 操作。

構造函數(shù)摘要

構造函數(shù) 描述
URI(String str) 通過解析給定的字符串構造一個 URI。
URI(String scheme, String ssp, String fragment) 從給定的組件構造一個 URI。
URI(String scheme, String userInfo, String host, int port, String path, String query, String fragment) 從給定的組件構造一個分層的 URI。
URI(String scheme, String host, String path, String fragment) 從給定的組件構造一個分層的 URI。
URI(String scheme, String authority, String path, String query, String fragment) 從給定的組件構造一個分層的 URI。

方法總結

修飾符和類型 方法 描述
int compareTo(URI that) 將此 URI 與另一個對象進行比較,該對象必須是 URI。
static URI create(String str) 通過解析給定的字符串創(chuàng)建一個 URI。
boolean equals(Object ob) 測試此 URI 是否與另一個對象相等。
String getAuthority() 返回此 URI 的解碼權限組件。
String getFragment() 返回此 URI 的解碼片段組件。
String getHost() 返回此 URI 的主機組件。
String getPath() 返回此 URI 的解碼路徑組件。
int getPort() 返回此 URI 的端口號。
String getQuery() 返回此 URI 的解碼查詢組件。
String getRawAuthority() 返回此 URI 的原始權限組件。
String getRawFragment() 返回此 URI 的原始片段組件。
String getRawPath() 返回此 URI 的原始路徑組件。
String getRawQuery() 返回此 URI 的原始查詢組件。
String getRawSchemeSpecificPart() 返回此 URI 的原始方案特定部分。
String getRawUserInfo() 返回此 URI 的原始用戶信息組件。
String getScheme() 返回此 URI 的方案組件。
String getSchemeSpecificPart() 返回此 URI 的已解碼方案特定部分。
String getUserInfo() 返回此 URI 的已解碼用戶信息組件。
int hashCode() 返回此 URI 的哈希碼值。
boolean isAbsolute() 說明這個URI是否是絕對的。
boolean isOpaque() 說明這個URI是否是不透明的。
URI normalize() 將這個URI的路徑規(guī)范化。
URI parseServerAuthority() 嘗試將此 URI 的權限組件(如果已定義)解析為用戶信息、主機和端口組件。
URI relativize(URI uri) 將給定的 URI 與此 URI 相對化。
URI resolve(String str) 通過解析給定的字符串構造一個新的 URI,然后根據(jù)這個 URI 解析它。
URI resolve(URI uri) 根據(jù)此 URI 解析給定的 URI。
String toASCIIString() 將此 URI 的內(nèi)容作為 US-ASCII 字符串返回。
String toString() 將此 URI 的內(nèi)容作為字符串返回。
URL toURL() 從此 URI 構造一個 URL。
從類 java.lang.Object 繼承的方法
clone, finalize, getClass, notify, notifyAll, wait, wait, wait

構造函數(shù)詳細信息

URI

public URI(String str) throws URISyntaxException

通過解析給定的字符串構造一個 URI。

此構造函數(shù)完全按照 RFC 2396 附錄 A 中的語法指定的方式解析給定的字符串,但以下偏差除外:

  • 允許空權限組件,只要其后跟非空路徑、查詢組件或片段組件。這允許解析諸如“file:///foo/bar”之類的 URI,這似乎是 RFC 2396 的意圖,盡管語法不允許這樣做。如果權限組件為空,則未定義用戶信息、主機和端口組件。
  • 允許空的相對路徑;這似乎是 RFC 2396 的意圖,盡管語法不允許這樣做。這種偏差的主要后果是,諸如“#foo”之類的獨立片段被解析為具有空路徑和給定片段的相對 URI,并且可以有效地針對基本 URI 進行解析。
  • 主機組件中的 IPv4 地址按照 RFC 2732 的規(guī)定進行嚴格解析:點分四組地址的每個元素必須包含不超過三個十進制數(shù)字。每個元素被進一步限制為不大于 255。
  • 僅包含單個域標簽的主機組件中的主機名允許以字母數(shù)字字符開頭。這似乎是 RFC 2396 第 3.2.2 節(jié)的意圖,盡管語法不允許這樣做。這種偏差的結果是分層 URI 的權限組件(例如 s://123)將解析為基于服務器的權限。
  • 主機組件允許使用 IPv6 地址。 IPv6 地址必須按照 RFC 2732 的規(guī)定括在方括號(“[”和“]”)中。IPv6 地址本身必須根據(jù) RFC 2373 進行解析。IPv6 地址進一步限制為描述不超過 16 個字節(jié)的地址信息, RFC 2373 中隱含但在語法中無法表達的約束。
  • 只要 RFC 2396 允許轉義八位字節(jié),即在用戶信息、路徑、查詢和片段組件中,以及如果權限是基于注冊表的權限組件中,則允許其他類別中的字符。這允許 URI 包含 US-ASCII 字符集中以外的 Unicode 字符。

參數(shù):

參數(shù)名稱 參數(shù)描述
str 要解析為 URI 的字符串

Throws:

Throw名稱 Throw描述
NullPointerException 如果 str 為空
URISyntaxException 如果給定的字符串違反了 RFC 2396,由上述偏差增強

URI

public URI(String scheme, String userInfo, String host, int port, String path, String query, String fragment) throws URISyntaxException

從給定的組件構造一個分層的 URI。

如果給出了方案,則路徑(如果也給出)必須為空或以斜杠字符 ('/') 開頭。 否則,新 URI 的一個組成部分可以通過為相應的參數(shù)傳遞 null 或在端口參數(shù)的情況下傳遞 -1 來保持未定義。

此構造函數(shù)首先根據(jù) RFC 2396 第 5.2 節(jié)第 7 步中指定的規(guī)則從給定組件構建 URI 字符串:

  1. 最初,結果字符串為空。
  2. 如果給出了一個方案,則將其附加到結果中,后跟一個冒號字符 (':')。
  3. 如果給出用戶信息、主機或端口,則附加字符串“//”。
  4. 如果給出了用戶信息,則附加它,后跟一個商業(yè)字符('@')。引用任何不在未保留、標點、轉義或其他類別中的字符。
  5. 如果給定主機,則附加它。如果主機是文字 IPv6 地址但未包含在方括號中('[' 和 ']'),則添加方括號。
  6. 如果給定端口號,則附加一個冒號字符 (':'),然后是十進制的端口號。
  7. 如果給出了路徑,則將其附加。任何不屬于未保留、標點符號、轉義或其他類別的字符,并且不等于斜杠字符 ('/') 或商業(yè)字符 ('@'),都會被引用。
  8. 如果給出查詢,則附加一個問號字符 ('?'),然后是查詢。任何不是合法 URI 字符的字符都會被引用。
  9. 最后,如果給出一個片段,則附加一個哈希字符('#'),然后是片段。任何不是合法 URI 字符的字符都會被引用。

然后解析生成的 URI 字符串,就像調(diào)用 URI(java.lang.String) 構造函數(shù),然后在結果上調(diào)用 parseServerAuthority() 方法一樣; 這可能會導致拋出 URISyntaxException。

參數(shù):

參數(shù)名稱 參數(shù)描述
scheme 方案名稱
userInfo 用戶名和授權信息
host 主機名
port 端口號
path 路徑
query 查詢
fragment 碎片

Throws:

Throw名稱 Throw描述
URISyntaxException 如果同時給出了方案和路徑,但路徑是相對的,如果從給定組件構造的 URI 字符串違反 RFC 2396,或者如果字符串的權限組件存在但不能被解析為基于服務器的權限

URI

public URI(String scheme, String authority, String path, String query, String fragment) throws URISyntaxException

從給定的組件構造一個分層的 URI。

如果給出了方案,則路徑(如果也給出)必須為空或以斜杠字符 ('/') 開頭。 否則,通過為相應的參數(shù)傳遞 null 可能會使新 URI 的組件未定義。

此構造函數(shù)首先根據(jù) RFC 2396 第 5.2 節(jié)第 7 步中指定的規(guī)則從給定組件構建 URI 字符串:

  1. 最初,結果字符串為空。
  2. 如果給出了一個方案,則將其附加到結果中,后跟一個冒號字符 (':')。
  3. 如果給定了權限,則附加字符串“//”,然后是權限。如果授權包含文字 IPv6 地址,則地址必須括在方括號中('[' 和 ']')。任何不屬于未保留、標點、轉義或其他類別的字符,并且不等于商業(yè)字符 ('@'),都會被引用。
  4. 如果給出了路徑,則附加它。任何不屬于未保留、標點符號、轉義或其他類別的字符,并且不等于斜杠字符 ('/') 或商業(yè)字符 ('@'),都會被引用。
  5. 如果給出查詢,則附加一個問號字符 ('?'),然后是查詢。任何不是合法 URI 字符的字符都會被引用。
  6. 最后,如果給出一個片段,則附加一個哈希字符('#'),然后是片段。任何不是合法 URI 字符的字符都會被引用。

然后解析生成的 URI 字符串,就像調(diào)用 URI(java.lang.String) 構造函數(shù),然后在結果上調(diào)用 parseServerAuthority() 方法一樣; 這可能會導致拋出 URISyntaxException。

參數(shù):

參數(shù)名稱 參數(shù)描述
scheme 方案名稱
authority 授權
path 路徑
query 查詢
fragment 碎片

Throws:

Throw名稱 Throw描述
URISyntaxException 如果同時給出了方案和路徑,但路徑是相對的,如果從給定組件構造的 URI 字符串違反 RFC 2396,或者如果字符串的權限組件存在但不能被解析為基于服務器的權限

URI

public URI(String scheme, String host, String path, String fragment) throws URISyntaxException

從給定的組件構造一個分層的 URI。

通過傳遞 null 可以使組件保持未定義。

這個便利構造函數(shù)就像通過調(diào)用七參數(shù)構造函數(shù)一樣工作,如下所示:

new URI(scheme, null, host, -1, path, null, fragment);

參數(shù):

參數(shù)名稱 參數(shù)描述
scheme 方案名稱
host 主機名
path 路徑
fragment 碎片

Throws:

Throw名稱 Throw描述
URISyntaxException 如果從給定組件構造的 URI 字符串違反 RFC 2396

URI

public URI(String scheme, String ssp, String fragment) throws URISyntaxException

從給定的組件構造一個 URI。

通過傳遞 null 可以使組件保持未定義。

此構造函數(shù)首先使用給定的組件構建一個字符串形式的 URI,如下所示:

  1. 最初,結果字符串為空。
  2. 如果給出了一個方案,則將其附加到結果中,后跟一個冒號字符 (':')。
  3. 如果給出了特定于方案的部分,則將其附加。 任何不是合法 URI 字符的字符都會被引用。
  4. 最后,如果給出一個片段,則將一個哈希字符 ('#') 附加到字符串,然后是片段。 任何不是合法 URI 字符的字符都會被引用。

然后解析生成的 URI 字符串,以創(chuàng)建新的 URI 實例,就像調(diào)用 URI(java.lang.String) 構造函數(shù)一樣; 這可能會導致拋出 URISyntaxException。

參數(shù):

參數(shù)名稱 參數(shù)描述
scheme 方案名稱
ssp 方案特定部分
fragment 碎片

Throws:

Throw名稱 Throw描述
URISyntaxException 如果從給定組件構造的 URI 字符串違反 RFC 2396

方法詳情

create

public static URI create(String str)

通過解析給定的字符串創(chuàng)建一個 URI。

這個方便的工廠方法就像調(diào)用 URI(java.lang.String) 構造函數(shù)一樣工作; 構造函數(shù)拋出的任何 URISyntaxException 都會被捕獲并包裝在一個新的 IllegalArgumentException 對象中,然后拋出該對象。

提供此方法用于已知給定字符串是合法 URI 的情況,例如在程序中聲明的 URI 常量,因此如果字符串不這樣解析將被視為編程錯誤。 直接拋出 URISyntaxException 的構造函數(shù)應該用于從用戶輸入或其他可能容易出錯的源構造 URI 的情況。

參數(shù):

參數(shù)名稱 參數(shù)描述
str 要解析為 URI 的字符串

返回:

新的 URI

Throws:

Throw名稱 Throw描述
NullPointerException 如果 str 為空
IllegalArgumentException 如果給定的字符串違反 RFC 2396

parseServerAuthority

public URI parseServerAuthority() throws URISyntaxException

嘗試將此 URI 的權限組件(如果已定義)解析為用戶信息、主機和端口組件。

如果這個 URI 的權限組件已經(jīng)被識別為基于服務器的,那么它已經(jīng)被解析為用戶信息、主機和端口組件。在這種情況下,或者如果此 URI 沒有權限組件,則此方法僅返回此 URI。

否則,此方法會再次嘗試將權限組件解析為用戶信息、主機和端口組件,并拋出異常,說明無法以這種方式解析權限組件的原因。

之所以提供此方法,是因為 RFC 2396 中指定的通用 URI 語法不能始終區(qū)分格式錯誤的基于服務器的權限和合法的基于注冊表的權限。因此,它必須將前者的某些實例視為后者的實例。例如,URI 字符串“//foo:bar”中的權限組件不是基于服務器的合法權限,但作為基于注冊表的權限是合法的。

在許多常見情況下,例如當工作 URI 已知為 URN 或 URL 時,所使用的分層 URI 將始終基于服務器。因此,它們必須按原樣解析或視為錯誤。在這些情況下,聲明如

URI u = new URI(str).parseServerAuthority();

可用于確保 u 始終引用一個 URI,如果它具有權限組件,則具有基于服務器的權限以及適當?shù)挠脩粜畔?、主機和端口組件。 調(diào)用此方法還確保如果無法以這種方式解析權限,則可以根據(jù)拋出的異常發(fā)出適當?shù)脑\斷消息。

返回:

一個URI,其權限字段已被解析為基于服務器的權限

Throws:

Throw名稱 Throw描述
URISyntaxException 如果此 URI 的權限組件已定義但不能根據(jù) RFC 2396 解析為基于服務器的權限

normalize

public URI normalize()

規(guī)范化此 URI 的路徑。

如果這個 URI 是不透明的,或者如果它的路徑已經(jīng)是正常的形式,那么這個 URI 被返回。 否則,將構造一個與此 URI 相同的新 URI,除了它的路徑是通過以符合 RFC 2396,第 5.2 節(jié),第 6 步,子步驟 c 到 f 的方式規(guī)范化此 URI 的路徑來計算的; 那是:

  1. 全部“.” 段被刪除。
  2. 如果“..”段前面有一個非“..”段,則這兩個段都被刪除。 重復此步驟,直到不再適用。
  3. 如果路徑是相對的,并且如果它的第一段包含一個冒號字符(':'),那么一個“.” 段是前置的。 這可以防止具有諸如“a:b/c/d”之類路徑的相對 URI 稍后被重新解析為具有“a”方案和“b/c/d”方案特定部分的不透明 URI . (偏離 RFC 2396)

如果在它們之前沒有足夠的非“..”段以允許將其刪除,則規(guī)范化路徑將從一個或多個“..”段開始。 規(guī)范化路徑將以“。”開頭。 如果在上面的步驟 3 中插入了一個片段。 否則,規(guī)范化路徑將不包含任何“?!?或“..”段。

返回:

與此 URI 等效的 URI,但其路徑為正常格式

resolve

public URI resolve(URI uri)

根據(jù)此 URI 解析給定的 URI。

如果給定的 URI 已經(jīng)是絕對的,或者如果這個 URI 是不透明的,則返回給定的 URI。

如果給定 URI 的片段組件已定義,其路徑組件為空,并且其方案、權限和查詢組件未定義,則返回具有給定片段但所有其他組件與該 URI 相同的 URI。 這允許表示獨立片段引用的 URI,例如“#foo”,可以有效地針對基本 URI 進行解析。

否則,此方法以與 RFC 2396 第 5.2 節(jié)一致的方式構造新的分層 URI; 那是:

  1. 使用此 URI 的方案以及給定 URI 的查詢和片段組件構造一個新的 URI。
  2. 如果給定 URI 具有權限組件,則新 URI 的權限和路徑取自給定 URI。
  3. 否則,從該 URI 復制新 URI 的權限組件,其路徑計算如下:
    1. 如果給定 URI 的路徑是絕對路徑,則新 URI 的路徑取自給定 URI。
    2. 否則,給定 URI 的路徑是相對的,因此新 URI 的路徑是通過根據(jù)該 URI 的路徑解析給定 URI 的路徑來計算的。 這是通過將此 URI 路徑的最后一段(如果有的話)與給定 URI 的路徑連接起來,然后像調(diào)用 normalize 方法一樣對結果進行規(guī)范化來完成的。

此方法的結果是絕對的,當且僅當此 URI 是絕對的或給定的 URI 是絕對的。

參數(shù):

參數(shù)名稱 參數(shù)描述
uri 要針對此 URI 解析的 URI

返回:

生成的 URI

Throws:

Throw名稱 Throw描述
NullPointerException 如果 uri 為空

resolve

public URI resolve(String str)

通過解析給定的字符串構造一個新的 URI,然后根據(jù)這個 URI 解析它。

這種便捷方法的工作方式就像調(diào)用它等同于評估表達式 resolve(URI.create(str))。

參數(shù):

參數(shù)名稱 參數(shù)描述
str 要解析為 URI 的字符串

返回:

生成的 URI

Throws:

Throw名稱 Throw描述
NullPointerException 如果 str 為空
IllegalArgumentException 如果給定的字符串違反 RFC 2396

relativize

public URI relativize(URI uri)

將給定的 URI 與此 URI 相對化。

給定 URI 與此 URI 的相對化計算如下:

  1. 如果此 URI 或給定 URI 不透明,或者如果兩個 URI 的方案和權限組件不相同,或者如果此 URI 的路徑不是給定 URI 路徑的前綴,則給定 返回 URI。
  2. 否則,使用從給定 URI 獲取的查詢和片段組件以及通過從給定 URI 路徑的開頭刪除此 URI 路徑來計算的路徑組件來構造新的相對分層 URI。

參數(shù):

參數(shù)名稱 參數(shù)描述
uri 要針對此 URI 進行相對化的 URI

返回:

生成的 URI

Throws:

Throw名稱 Throw描述
NullPointerException 如果 uri 為空

toURL

public URL toURL() throws MalformedURLException

從此 URI 構造一個 URL。

這種便捷方法的工作方式就好像調(diào)用它等同于在首先檢查此 URI 是否為絕對值之后評估表達式 new URL(this.toString())。

返回:

從此 URI 構造的 URL

Throws:

Throw名稱 Throw描述
IllegalArgumentException 如果此 URL 不是絕對的
MalformedURLException 如果找不到 URL 的協(xié)議處理程序,或者在構造 URL 時發(fā)生了其他錯誤

getScheme

public String getScheme()

返回此 URI 的方案組件。

URI 的方案組件(如果已定義)僅包含字母數(shù)字類別和字符串“-.+”中的字符。 方案總是以字母字符開頭。

URI 的方案組件不能包含轉義的八位字節(jié),因此此方法不執(zhí)行任何解碼。

返回:

此 URI 的方案組件,如果方案未定義,則為 null

isAbsolute

public boolean isAbsolute()

判斷這個 URI 是否是絕對的。

當且僅當它具有方案組件時,URI 才是絕對的。

返回:

當且僅當此 URI 是絕對的,則為 true

isOpaque

public boolean isOpaque()

判斷此 URI 是否不透明。

當且僅當 URI 是絕對的并且其特定于方案的部分不以斜杠字符 ('/') 開頭時,URI 才是不透明的。 一個不透明的 URI 有一個方案,一個特定于方案的部分,可能還有一個片段; 所有其他組件都未定義。

返回:

當且僅當此 URI 不透明時才為 true

getRawSchemeSpecificPart

public String getRawSchemeSpecificPart()

返回此 URI 的原始方案特定部分。 特定于方案的部分永遠不會未定義,盡管它可能為空。

URI 的特定于方案的部分僅包含合法的 URI 字符。

返回:

此 URI 的原始方案特定部分(從不為空)

getSchemeSpecificPart

public String getSchemeSpecificPart()

返回此 URI 的已解碼方案特定部分。

此方法返回的字符串與 getRawSchemeSpecificPart 方法返回的字符串相同,但所有轉義八位字節(jié)序列均已解碼。

返回:

此 URI 的解碼方案特定部分(從不為空)

getRawAuthority

public String getRawAuthority()

返回此 URI 的原始權限組件。

URI 的權限組件(如果已定義)僅包含商業(yè)字符 ('@') 以及未保留、標點、轉義和其他類別中的字符。 如果權限是基于服務器的,則進一步限制它具有有效的用戶信息、主機和端口組件。

返回:

此 URI 的原始權限組件,如果權限未定義,則為 null

getAuthority

public String getAuthority()

返回此 URI 的解碼權限組件。

此方法返回的字符串與 getRawAuthority 方法返回的字符串相同,但所有轉義八位字節(jié)序列均已解碼。

返回:

此 URI 的已解碼權限組件,如果權限未定義,則為 null

getRawUserInfo

public String getRawUserInfo()

返回此 URI 的原始用戶信息組件。

URI 的用戶信息組件(如果已定義)僅包含未保留、標點、轉義和其他類別中的字符。

返回:

此 URI 的原始用戶信息組件,如果用戶信息未定義,則為 null

getUserInfo

public String getUserInfo()

返回此 URI 的已解碼用戶信息組件。

此方法返回的字符串與 getRawUserInfo 方法返回的字符串相同,只是所有轉義的八位字節(jié)序列都被解碼。

返回:

此 URI 的已解碼用戶信息組件,如果用戶信息未定義,則為 null

getHost

public String getHost()

返回此 URI 的主機組件。

URI 的主機組件(如果已定義)將具有以下形式之一:

  • 由一個或多個標簽組成的域名,這些標簽由句點字符 ('.') 分隔,可選地后跟一個句點字符。 每個標簽都由字母數(shù)字字符和連字符 ('-') 組成,但連字符永遠不會作為標簽中的第一個或最后一個字符出現(xiàn)。 由兩個或多個標簽組成的域名的最右側標簽以字母字符開頭。
  • digit+.digit+.digit+.digit+ 形式的點分四線 IPv4 地址,其中沒有數(shù)字序列長于三個字符,并且沒有序列的值大于 255。
  • 用方括號('[' 和 ']')括起來的 IPv6 地址,由十六進制數(shù)字、冒號字符(':')和可能嵌入的 IPv4 地址組成。 IPv6 地址的完整語法在 RFC 2373:IPv6 Addressing Architecture 中指定。

URI 的主機組件不能包含轉義的八位字節(jié),因此此方法不執(zhí)行任何解碼。

返回:

此 URI 的主機組件,如果主機未定義,則為 null

getPort

public int getPort()

返回此 URI 的端口號。

URI 的端口組件(如果已定義)是一個非負整數(shù)。

返回:

此 URI 的端口組件,如果端口未定義,則為 -1

getRawPath

public String getRawPath()

返回此 URI 的原始路徑組件。

URI 的路徑組件(如果已定義)僅包含斜杠字符 ('/')、商業(yè)字符 ('@') 以及未保留、標點、轉義和其他類別中的字符。

返回:

此 URI 的路徑組件,如果路徑未定義,則為 null

getPath

public String getPath()

返回此 URI 的解碼路徑組件。

此方法返回的字符串與 getRawPath 方法返回的字符串相同,只是所有轉義八位字節(jié)序列都被解碼。

返回:

此 URI 的解碼路徑組件,如果路徑未定義,則為 null

getRawQuery

public String getRawQuery()

返回此 URI 的原始查詢組件。

URI 的查詢組件(如果已定義)僅包含合法的 URI 字符。

返回:

此 URI 的原始查詢組件,如果查詢未定義,則為 null

getQuery

public String getQuery()

返回此 URI 的解碼查詢組件。

此方法返回的字符串與 getRawQuery 方法返回的字符串相同,但所有轉義八位位組序列均已解碼。

返回:

此 URI 的已解碼查詢組件,如果查詢未定義,則為 null

getRawFragment

public String getRawFragment()

返回此 URI 的原始片段組件。

URI 的片段組件(如果已定義)僅包含合法的 URI 字符。

返回:

此 URI 的原始片段組件,如果片段未定義,則為 null

getFragment

public String getFragment()

返回此 URI 的解碼片段組件。

此方法返回的字符串與 getRawFragment 方法返回的字符串相同,但所有轉義八位字節(jié)序列均已解碼。

返回:

此 URI 的已解碼片段組件,如果片段未定義,則為 null

equals

public boolean equals(Object ob)

測試此 URI 是否與另一個對象相等。

如果給定對象不是 URI,則此方法立即返回 false。

要使兩個 URI 被視為相等,要求兩者都是不透明的或都是分層的。它們的方案必須要么都是未定義的,要么是相等的,不考慮大小寫。它們的片段必須要么都是未定義的,要么是相等的。

要使兩個不透明的 URI 被視為相等,它們的特定于方案的部分必須相等。

對于被認為相等的兩個分層 URI,它們的路徑必須相等,并且它們的查詢必須要么都未定義,要么相等。他們的權限必須要么都是未定義的,要么都是基于注冊表的,或者都是基于服務器的。如果它們的權限被定義并且基于注冊,那么它們必須是平等的。如果它們的權限被定義并且是基于服務器的,那么它們的主機必須相同而不考慮大小寫,它們的端口號必須相同,并且它們的用戶信息組件必須相同。

在測試兩個 URI 的用戶信息、路徑、查詢、片段、權限或特定于方案的部分是否相等時,將比較這些組件的原始形式而不是編碼形式,并且比較轉義八位字節(jié)的十六進制數(shù)字而不考慮案件。

此方法滿足 Object.equals 方法的一般約定。

覆蓋:

類 Object 中的等于

參數(shù):

參數(shù)名稱 參數(shù)描述
ob 此對象要與之比較的對象

返回:

當且僅當給定對象是與此 URI 相同的 URI 時,才為 true

hashCode

public int hashCode()

返回此 URI 的哈希碼值。 哈希碼基于 URI 的所有組件,并滿足 Object.hashCode 方法的一般約定。

覆蓋:

類 Object 中的 hashCode

返回:

此 URI 的哈希碼值

compareTo

public int compareTo(URI that)

將此 URI 與另一個對象進行比較,該對象必須是 URI。

在比較兩個 URI 的對應組件時,如果一個組件未定義但另一個已定義,則認為第一個小于第二個。 除非另有說明,否則字符串組件將根據(jù) String.compareTo 方法定義的自然、區(qū)分大小寫的順序進行排序。 通過比較它們的原始形式而不是它們的編碼形式來比較受編碼的字符串組件。

URI 的順序定義如下:

  • 兩個具有不同方案的 URI 根據(jù)它們方案的順序排序,不考慮大小寫。
  • 分層 URI 被認為小于具有相同方案的不透明 URI。
  • 具有相同方案的兩個不透明 URI 根據(jù)其方案特定部分的順序進行排序。
  • 具有相同方案和方案特定部分的兩個不透明 URI 根據(jù)其片段的順序進行排序。
  • 兩個具有相同方案的分層 URI 根據(jù)其權限組件的順序進行排序:
    • 如果兩個權限組件都是基于服務器的,那么 URI 會根據(jù)它們的用戶信息組件進行排序; 如果這些組件相同,則 URI 將根據(jù)其主機的順序進行排序,而不考慮大小寫; 如果主機相同,則 URI 將根據(jù)其端口的順序進行排序。
    • 如果一個或兩個權限組件是基于注冊表的,則 URI 根據(jù)其權限組件的順序進行排序。
  • 最后,將具有相同方案和權限組件的兩個分層URI按照路徑的順序進行排序; 如果它們的路徑相同,則根據(jù)查詢的順序對它們進行排序; 如果查詢相同,則根據(jù)其片段的順序對其進行排序。

此方法滿足 Comparable.compareTo 方法的一般約定。

指定者:

接口 ComparableURI 中的 compareTo

參數(shù):

參數(shù)名稱 參數(shù)描述
that 此 URI 要與之比較的對象

返回:

負整數(shù)、零或正整數(shù),因為此 URI 小于、等于或大于給定 URI

Throws:

Throw名稱 Throw描述
ClassCastException 如果給定對象不是 URI

toString

public String toString()

將此 URI 的內(nèi)容作為字符串返回。

如果此 URI 是通過調(diào)用此類中的構造函數(shù)之一創(chuàng)建的,則返回與原始輸入字符串或根據(jù)最初給定組件計算的字符串等效的字符串(視情況而定)。 否則,此 URI 是通過規(guī)范化、解析或相對化創(chuàng)建的,因此根據(jù) RFC 2396 第 5.2 節(jié)第 7 步中指定的規(guī)則從此 URI 的組件構造一個字符串。

覆蓋:

類 Object 中的 toString

返回:

此 URI 的字符串形式

toASCIIString

public String toASCIIString()

將此 URI 的內(nèi)容作為 US-ASCII 字符串返回。

如果此 URI 不包含其他類別中的任何字符,則調(diào)用此方法將返回與調(diào)用 toString 方法相同的值。 否則,此方法就像通過調(diào)用該方法然后對結果進行編碼一樣工作。

返回:

此 URI 的字符串形式,根據(jù)需要進行編碼,使其僅包含 US-ASCII 字符集中的字符

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號