語言

URI 類別

定義

代表統一資源識別碼(URI)參照。

[Android.Runtime.Register("java/net/URI", DoNotGenerateAcw=true)]
public sealed class URI : Java.Lang.Object, IDisposable, Java.IO.ISerializable, Java.Lang.IComparable
[<Android.Runtime.Register("java/net/URI", DoNotGenerateAcw=true)>]
type URI = class
    inherit Object
    interface ISerializable
    interface IJavaObject
    interface IDisposable
    interface IJavaPeerable
    interface IComparable
繼承
屬性
實作

備註

代表統一資源識別碼(URI)參照。

除了下方提到的一些小偏差外,此類別的實例代表由 RFC  定義的 URI 參考;2396:統一資源識別碼(URI):通用語法http://www.ietf.org/rfc/rfc2396.txt,經 RFC  修訂;2732:URL 中 IPv6 位址http://www.ietf.org/rfc/rfc2732.txt的格式化。 字面 IPv6 位址格式也支援 scope_ids。 scope_ids的語法與用法在此說明。 此類別提供建構子,用於從組件建立 URI 實例,或透過解析字串形式來建立實例,存取實例中各個組件的方法,以及正規化、解析與相對化 URI 實例的方法。 此類別的實例是不可變的。

<h3> URI 語法與元件 </h3>

在最高層級,一個以字串形式呈現的 URI 參考(以下簡稱「URI」)包含語法

<Blockquote> [scheme<b>:</b>]scheme-specific-part[<b>#</b> fragment] </blockquote>

方括號[...]代表可選成分,字<元b>:</b>和<b>#</B>則代表自己。

絕對 URI 指定一個方案;非絕對的 URI 稱為相對的。 URI 也會依據不 透明 性或 階層式來分類。

不透明 URI 是指其特定結構部分不以斜線字'/'元()開頭的絕對 URI。 不透明的 URI 則不會再進行解析。 不透明 URI 的一些例子包括:

<Blockquote><表格 cellpadding=0 cellspacing=0 summary=“layout”><tr><td>mailto:java-net@java.sun.com<td></tr><tr><td>news:comp.lang.java<td></tr tr td/td/tr><tr td><>urn:isbn:096139210x</td></tr/table><></blockquote>

階層式 URI 要麼是絕對的 URI,其特定方案部分以斜線字元開頭;要麼是相對 URI,即不指定方案的 URI。 一些階層式 URI 的例子包括:

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

階層式 URI 會根據語法進行進一步解析

<Blockquote> [方案<b>:</b>][<b>//</b> 權威][path][<b>?</b> 查詢][<b>#</b> 片段] </blockquote>

其中角色 <b>:</b>、<b>/</b>、<b>?</b ><和 b>#</b> 代表自己。 階層式 URI 中特定於 scheme 的部分由 scheme 與 fragment 元件之間的字元組成。

階層式 URI 的權威組件若指定為 伺服器端登錄檔端。 伺服器端權威依照熟悉的語法進行解析

<Blockquote> [用戶資訊<b>@</b>]host[<b>:</b> port] </blockquote>

角色 <b>@</b> 和 <b>:</b> 各自站立。 目前幾乎所有使用的 URI 方案都是基於伺服器的。 不以此類方式解析的權威元件被視為基於登錄檔。

階層式 URI 的路徑組件若以斜線字'/'元開頭,則稱為絕對 ;否則為相對元件。 階層式 URI 的路徑,無論是絕對的還是指定權威的,都是絕對的。

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

<blockquote><table summary=“描述 URI 的組成部分:scheme,scheme-specific-part,authority,user-info,host,port,path,query,fragment”tr><>< th> Component</th><>/th<></tr><tr td><>scheme</td><>String< td/td></tr><tr td><scheme-specific-part>    </TD><TD>String</TD></TR><TR><TD>權威</TD><TD>String</TD></TR><TR><用戶>資訊</TD><TD>String</TD></TR><TR><TD>主機</TD><TD>String</TD></TR><TR><TD>Port/TD<TD><>int/TD</TR><>TR<><TD 路徑></TD><TD>String</TD/TR><><TR><TD>query</TD><TD>String</TD></TR><TR><TD>fragment</td><TD>String</TD></TR/Table><></Blockquote>

在特定情況下,任何特定元件要麼 未定義 ,要麼以不同值 定義 。 未定義的字串成分以 null表示,而未定義的整數成分則以 -1表示。 字串組件可以定義為空字串作為其值;這並不等同於該組件是未定義的。

某個元件在實例中是否被定義,取決於所代表的 URI 類型。 絕對 URI 包含一個方案成分。 不透明 URI 包含一個方案、一個方案特定的部分,可能還有一個片段,但沒有其他元件。 階層式 URI 總是有一條路徑(雖然可能是空的)和一個方案專屬部分(至少包含該路徑),且可能包含其他任何元件。 若權限元件存在且為伺服器端,則會定義主機元件,並定義使用者資訊元件與埠元件。

<h4> 對 URI 實例 <的操作 /h4>

此類別支援的關鍵運算包括 正規化解析度相對化

正規化 是從階層式 URI 的路徑組件中移除不必要的 "." segment ".." 的過程。 每個 "." 段落都被簡單地移除。 ".."只有當段前有非".."段時,才會被移除。 正規化對不透明的 URI 沒有影響。

解析 是將一個 URI 與另一個 基礎 URI 解析的過程。 最終的 URI 由兩個 URI 的元件組成,依照 RFC  規定的方式;2396,從基礎 URI 中取用元件,以處理原始未指定的部分。 對於階層式 URI,原始路徑會與基底路徑解析,然後進行正規化。 例如,解決

<引用>docs/guide/collections/designfaq.html#28 與註記;               (1) </引用>

對底面 URI http://java.sun.com/j2se/1.3/ 是結果 URI

<引用>http://java.sun.com/j2se/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 的絕對與相對路徑解析。 將該 URI file:///~calendar 解析至任何其他 URI,僅會得到原始 URI,因為它是絕對的。 將上述相對 URI (2) 與相對基底 URI (1) 解析,得到正規化但仍相對的 URI

<引用>demo/jfc/SwingSet2/src/SwingSet2.java</引用>

相對最後是解析的倒數:對於任意兩個正規化 URI u 和 nbsp;v

< >引用U.relativize(.resolve(v)).equals(v)  以及<BR>U.resolve(U.relativize(V)).equals(V)&NBSP; <BR></Blockquote>

此操作在構建包含必須相對於文件基礎 URI 進行的文件時非常有用。 例如,將URI相對化

<引用>http://java.sun.com/j2se/1.3/docs/guide/index.html</引用>

對底 URI

<引用>http://java.sun.com/j2se/1.3</引用>

得到相對 URI docs/guide/index.html

<h4> 角色分類 </h4>

RFC 2396 明確規定了 URI 參考中各個元件中允許使用哪些字元。 以下類別,大多數取自該規範,用以描述這些限制條件:

<blockquote><表格 cellspacing=2 summary=「描述類別 alpha、digit、alphanum、unservd、punct、reserved、escaped 及其他」tr><>< th valign=頂部> alpha</th><td>US-ASCII 字母字元,'A'nbsp;通過 'Z'以及 'a' 通過 'z'</td></tr><tr th><valign=頂>端數字</th><td>US-ASCII 十進位數字字元,'0'nbsp;通過 '9'</td></tr><tr><th valign=頂部>字母數</th><td>所有字母數字字符</td></tr><tr><th valign=頂部>無保留    </th><td>所有字母數字字符連同字串"_-!.~'()*"<中的字元/td></tr><tr><th valign=頂></th><td>字串",;:$&+="<中的字元 /td></tr><tr th><valign=頂部>保留</th><td>所有標點字元與字串"?/[]@"<中的字元一起 /td></tr><tr th><valign=頂部>轉義</th><td>跳脫八位元組,即由百分比字元('%')後接兩個十六進位數字('0'-'9''A'-'F' , 和'a'-'f')</td></tr><tr tr><th valign=頂部>其他</th><td>不在 US-ASCII 字元集中的Unicode字元,則不是控制字元(根據java.lang.Character#isISOControl(char) Character.isISOControl方法),且不是空格字元(根據方法java.lang.Character#isSpaceChar(char) Character.isSpaceChar)  (<b>偏離 RFC 2396</b>,限制為 US-ASCII)</td></tr></table/blockquote><>

「legal-chars」> 所有合法 URI 字元集合包括 無保留保留逃脫其他 字元。

<h4> 脫離八位元組、引用、編碼與解碼 </h4>

RFC 2396 允許跳脫八位元組出現在使用者資訊、路徑、查詢及片段元件中。 逃逸在URI中有兩個目的:

<UL>

<李>

當 URI 必須嚴格遵守 RFC  時,編碼非US-ASCII 字元;2396 不含其他字元。

</李>

<李>

引用那些在元件中本來是非法角色的例子。 使用者資訊、路徑、查詢和片段元件在哪些字元被視為合法或非法上略有差異。

</李>

</ul>

這些目的在本類別中由三個相關操作實現:

<UL>

<李>

「編碼」> 一個字 元是透過 替換為代表該字元組的 UTF-8 字元組序列來編碼。 例如,歐元貨幣符號('\u005Cu20AC')編碼為 "%E2%82%AC"(<b>偏離RFC 2396</b>,並未指定任何特定字元集。)

</李>

<李>

「引用」> 非法字元僅透過編碼來 引用 。 例如,空格字元會被引用為 "%20"。 UTF-8 包含 US-ASCII,因此對於 US-ASCII 字元,此轉換效果正好符合 RFC 2396 的要求。

</李>

<李>

「解碼」> 一串逃逸的八位元組會透過替換為 UTF-8 字元集中所代表的字元序列 來解碼 。 UTF-8 包含 US-ASCII,因此解碼會解除任何引號的 US-ASCII 字元,也會解碼任何編碼的非US-ASCII 字元。 若解碼逃逸八位元組時發生錯誤,錯誤八位元組會被 '\u005CuFFFD'Unicode 替換字元取代。

</李>

</ul>

這些運算在本類別的構造子與方法中會如次展示:

<UL>

<李>

#URI(java.lang.String)單參數建構器要求參數中任何非法字元必須引用,並保留任何逃逸的八位元組及 其他 存在字元。

</李>

<李>

#URI(java.lang.String,java.lang.String,java.lang.String,int,java.lang.String,java.lang.String,java.lang.String)多參數建構子會根據出現的元件所要求引用非法字元。 這些構造器總是引用百分比字元('%')。 其他字元則被保留。

</李>

<李>

這些 #getRawUserInfo() getRawUserInfo#getRawPath() getRawPath#getRawQuery() getRawQuery#getRawFragment() getRawFragment、 、 #getRawAuthority() getRawAuthority#getRawSchemeSpecificPart() getRawSchemeSpecificPart 及 方法會以原始形式回傳其對應組件的值,且不解釋任何逃逸八位元組。 這些方法回傳的字串可能包含逃逸的八位元組及 其他 字元,且不會包含任何非法字元。

</李>

<李>

這些 #getUserInfo() getUserInfo#getPath() getPath#getQuery() getQuery#getFragment() getFragment#getAuthority() getAuthority#getSchemeSpecificPart() getSchemeSpecificPart 、 及 方法在對應組件中解碼任何逃逸的八位元組。 這些方法回傳的字串可能包含 其他 字元或非法字元,且不會包含任何逃逸的八位元組。

</李>

<李>

#toString() toString 方法回傳一個帶有所有必要引號的 URI 字串,但可能包含 其他 字元。

</李>

<李>

#toASCIIString() toASCIIString 方法回傳一個完全引號且編碼好的 URI 字串,且不包含 其他 字元。

</李>

</ul>

<h4> 恆等 <式 /h4>

對於任何 URI U,情況總是如此

<Blockquote>new URI(u.toString()).equals(u)  </區塊引用>

對於任何不含冗餘語法(如空權威前兩條斜杠(如  )或主機名稱後有冒號但無埠(如 file:///tmp/ ),且不編碼除必須引號字元外的 URI http://java.sun.com:,以下身份亦成立:

new URI(<i>u</i>.getScheme(),
<i>u</i>.getSchemeSpecificPart(),
<i>u</i>.getFragment())
                .equals(<i>u</i>)

在所有情況下,

new URI(<i>u</i>.getScheme(),
<i>u</i>.getUserInfo(), <i>u</i>.getAuthority(),
<i>u</i>.getPath(), <i>u</i>.getQuery(),
<i>u</i>.getFragment())
                .equals(<i>u</i>)

u 是階層式的,且

new URI(<i>u</i>.getScheme(),
<i>u</i>.getUserInfo(), <i>u</i>.getHost(), <i>u</i>.getPort(),
<i>u</i>.getPath(), <i>u</i>.getQuery(),
<i>u</i>.getFragment())
                .equals(<i>u</i>)

如果 U 是階層式的,且沒有權限或伺服器端權限。

<h4> URI、URL 與 URN </h4>

URI 是一種統一的資源 識別碼 ,而 URL 則是統一的資源 定位符。 因此,抽象來說,每個 URL 都是 URI,但並非每個 URI 都是 URL。 這是因為 URI 還有另一個子類別——統一資源 名稱 (URN),它會命名資源,但不明確說明如何定位資源。 mailto上述 、 newsisbn URI 是 URN 的例子。

URI 與 URL 之間的概念區別反映在這個類別與類別 URL 之間的差異中。

此類別的實例代表 RFC 2396 定義的語法意義上的 URI 參考。 URI 可以是絕對的,也可以是相對的。 URI 字串依照通用語法進行解析,不考慮其所指定的方案(若有的話)。 不會對主機進行查詢(如果有的話),也不會建構依賴於方案的串流處理程序。 等式、雜湊與比較嚴格依據實例的字元內容來定義。 換句話說,URI 實例不過是一個結構化字串,支援比較、正規化、解析與相對化等語法無關操作。

相較之下,類別的 URL 實例代表 URL 的語法成分,以及存取該資源所需的部分資訊。 URL 必須是絕對的,也就是說,它必須始終指定一個方案。 URL 字串會依照其結構進行解析。 對於一個 URL 總是會建立串流處理程序,事實上,若方案中沒有可用的處理程序,則不可能建立 URL 實例。 相等與雜湊取決於方案以及主機的網際網路位址(若有);比較並不明確。 換句話說,URL 是一個結構化字串,支援解析的語法操作,以及網路 I/O 操作,如查找主機並開啟與指定資源的連線。

在 1.4 版本加入。

Java 文件 java.net.URI

本頁部分內容為基於 Open Source Project 所創建與分享的作品,並依授權條款所描述的使用進行修改。

建構函式

名稱 Description
URI(String, String, String, Int32, String, String, String)

從給定元件構建階層式 URI。

URI(String, String, String, String, String)

從給定元件構建階層式 URI。

URI(String, String, String, String)

從給定元件構建階層式 URI。

URI(String, String, String)

從給定元件構建一個 URI。

URI(String)

透過解析給定字串來構造 URI。

屬性

名稱 Description
Authority

回傳此 URI 的解碼權威元件。

Class

回傳此 Object的執行時類別。

(繼承來源 Object)
Fragment

回傳此 URI 中解碼的片段部分。

Handle

底層 Android 實例的帳號。

(繼承來源 Object)
Host

回傳此 URI 的宿主元件。

IsAbsolute

判斷這個上呼吸道是否絕對。

IsOpaque

可以判斷這個上呼吸道是否不透明。

JniIdentityHashCode

取得由互通執行時指派給此 Java 對等端的身份雜湊碼。

(繼承來源 Object)
JniManagedPeerState

代表統一資源識別碼(URI)參照。

(繼承來源 JavaObject)
JniPeerMembers

代表統一資源識別碼(URI)參照。

Path

回傳此 URI 中解碼的路徑元件。

PeerReference

取得這個 Java 節點的 JNI 物件參考。

(繼承來源 Object)
Port

會回傳這個 URI 的埠號。

Query

回傳此 URI 中解碼後的查詢元件。

RawAuthority

回傳此 URI 的原始權威成分。

RawFragment

回傳此 URI 的原始片段部分。

RawPath

回傳此 URI 的原始路徑成分。

RawQuery

回傳此 URI 的原始查詢元件。

RawSchemeSpecificPart

回傳此 URI 中特定方案的原始部分。

RawUserInfo

回傳此 URI 的原始使用者資訊部分。

Scheme

回傳此 URI 的 scheme 部分。

SchemeSpecificPart

回傳此 URI 中解碼後的方案專屬部分。

ThresholdClass

此 API 支援 Mono for Android 基礎架構,並非直接從你的程式碼中使用。

(繼承來源 Object)
ThresholdType

此 API 支援 Mono for Android 基礎架構,並非直接從你的程式碼中使用。

(繼承來源 Object)
UserInfo

回傳解碼後的使用者資訊元件。

方法

名稱 Description
Clone()

建立並回傳此物件的副本。

(繼承來源 Object)
CompareTo(URI)

將此 URI 與另一個物件比較,該物件必須是 URI。

Construct(JniObjectReference, JniObjectReferenceOptions)

代表統一資源識別碼(URI)參照。

(繼承來源 JavaObject)
Create(String)

透過解析給定字串建立 URI。

Dispose()

釋放該 Java 節點所持有的資源。

(繼承來源 Object)
Dispose(Boolean)

釋放該 Java 節點所持有的資源。

(繼承來源 Object)
DisposeUnlessReferenced()

代表統一資源識別碼(URI)參照。

(繼承來源 JavaObject)
Equals(Object)

代表統一資源識別碼(URI)參照。

(繼承來源 JavaObject)
Equals(Object)

表示是否有其他物體「等同」於此物。

(繼承來源 Object)
GetHashCode()

回傳物件的雜湊碼值。

(繼承來源 Object)
JavaFinalize()
已淘汰.

當垃圾回收判定該物件不再有相關參考時,由垃圾回收器呼叫。

(繼承來源 Object)
Normalize()

讓這個URI的路徑正常化。

Notify()

喚醒一個正在該物件監視器上等待的執行緒。

(繼承來源 Object)
NotifyAll()

喚醒所有等待該物件監視器的執行緒。

(繼承來源 Object)
ParseServerAuthority()

嘗試將此 URI 的權威組件(如定義)解析為使用者資訊、主機及埠組件。

Relativize(URI)

將給定的 URI 相對化為該 URI。

Resolve(String)

透過解析給定字串,再用該 URI 解析,建構新的 URI。

Resolve(URI)

將給定的 URI 與該 URI 解決。

SetHandle(IntPtr, JniHandleOwnership)

設定 Handle 屬性。

(繼承來源 Object)
SetPeerReference(JniObjectReference, JniObjectReferenceOptions)

代表統一資源識別碼(URI)參照。

(繼承來源 JavaObject)
ToArray<T>()

從這個 Java 陣列包裝器建立一個受管理陣列。

(繼承來源 Object)
ToASCIIString()

會將此 URI 的內容回傳為 US-ASCII 字串。

ToString()

回傳物件的字串表示。

(繼承來源 Object)
ToURL()

從此 URI 建構一個網址。

UnregisterFromRuntime()

將此 Java 節點從互通執行時中取消註冊。

(繼承來源 Object)
Wait()

導致目前執行緒等待被喚醒,通常是透過 <em>通知</><em 或 em>中斷</em> 來喚醒。

(繼承來源 Object)
Wait(Int64, Int32)

會讓目前執行緒等待喚醒,通常是透過 <em>通知</><em 或 em>中斷</em>,或是經過一定的真實時間。

(繼承來源 Object)
Wait(Int64)

會讓目前執行緒等待喚醒,通常是透過 <em>通知</><em 或 em>中斷</em>,或是經過一定的真實時間。

(繼承來源 Object)

明確介面實作

名稱 Description
IComparable.CompareTo(Object)

代表統一資源識別碼(URI)參照。

IJavaPeerable.Disposed()

代表統一資源識別碼(URI)參照。

(繼承來源 JavaObject)
IJavaPeerable.Finalized()

代表統一資源識別碼(URI)參照。

(繼承來源 JavaObject)
IJavaPeerable.JniObjectReferenceControlBlock

代表統一資源識別碼(URI)參照。

(繼承來源 JavaObject)
IJavaPeerable.SetJniIdentityHashCode(Int32)

代表統一資源識別碼(URI)參照。

(繼承來源 JavaObject)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

代表統一資源識別碼(URI)參照。

(繼承來源 JavaObject)
IJavaPeerable.SetPeerReference(JniObjectReference)

代表統一資源識別碼(URI)參照。

(繼承來源 JavaObject)
IJavaPeerable.UnregisterFromRuntime()

代表統一資源識別碼(URI)參照。

擴充方法

名稱 Description
GetJniTypeName(IJavaPeerable)

取得實例 self類型的 JNI 名稱。

JavaAs<TResult>(IJavaPeerable)

試著強制self輸入 TResult,檢查 強制在 Java 端是否有效。

JavaCast<TResult>(IJavaObject)

執行 Android 執行時檢查型別轉換。

JavaCast<TResult>(IJavaObject)

代表統一資源識別碼(URI)參照。

TryJavaCast<TResult>(IJavaPeerable, TResult)

試著強制self輸入 TResult,檢查 強制在 Java 端是否有效。

適用於