Share via


URI 类

定义

表示统一资源标识符 (URI) 引用。

[Android.Runtime.Register("java/net/URI", DoNotGenerateAcw=true)]
public sealed class URI : Java.Lang.Object, IDisposable, Java.Interop.IJavaPeerable, 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,其特定于方案的部分不以斜杠字符开头, ('/') 。 不透明 URI 不受进一步分析的约束。 不透明 URI 的一些示例如下:

<blockquote><table cellpadding=0 cellspacing=0 summary=“layout”<>tr><td td>><<mailto:java-net@java.sun.com/tr><tr><td td><><news:comp.lang.java/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<>file:///~/calendar/blockquote>

分层 URI 根据语法进行进一步分析

<blockquote> [scheme<b>:</b>][<b>//</b>authority][path][<b><?/b>query][<b>#</b>fragment] </blockquote>

其中字符 <b><:/b>、<b</>/b>、<b?></b> 和 <b/b>#<> 代表自身。 分层 URI 中特定于方案的部分由方案和片段组件之间的字符组成。

分层 URI 的颁发机构组件(如果指定)是 基于服务器基于注册表的。 基于服务器的颁发机构根据熟悉的语法进行分析

<blockquote> [user-info<b><@/b>]host[<b>:</b>port] </blockquote>

其中字符 <b<>@/b> 和 <b:></b> 代表自身。 目前使用的几乎所有 URI 方案都是基于服务器的。 不以这种方式进行分析的颁发机构组件被视为基于注册表的组件。

如果分层 URI 的路径组件以斜杠字符 ('/') 开头,则它本身是绝对的;否则它是相对的。 分层 URI 的路径是绝对的,或者指定颁发机构始终是绝对的。

总之,URI 实例具有以下 9 个组件:

<blockquote><table summary=“Describes of a URI:scheme,scheme-specific-part,authority,user-info,host,port,path,query,fragment”<>tr><th>Component</th><>Type</th></tr><tr td><>scheme</td td>String</td><></tr><td><>scheme-specific-part    </td><td><String/td></tr><td>><authority</td tdString><></td></tr><td><>user-info</td td><<>String/td></tr><><td>host</td tdString><></td></tr><td><>port</td td/td><>< tdint></tr><td><>path</td td>String</td><></tr><tr><td>query</td><td><String/td></tr>><<td>fragment</td td><<String>/td></tr></table></blockquote>

在给定实例中,任何特定组件要么 未定义 ,要么使用非重复值 进行定义 。 未定义的字符串组件由 null表示,而未定义的整数组件由 -1表示。 字符串组件可以定义为将空字符串作为其值;这不等同于未定义的组件。

实例中是否定义了特定组件取决于所表示的 URI 的类型。 绝对 URI 具有方案组件。 不透明 URI 具有方案、特定于方案的部分以及可能的片段,但没有其他组件。 分层 URI 始终有一个路径 (尽管它可能是空的) 和特定于方案的部分 (至少包含路径) ,并且可能具有任何其他组件。 如果颁发机构组件存在且基于服务器,则将定义主机组件,并定义用户信息和端口组件。

<h4> 对 URI 实例的操作 </h4>

此类支持的关键操作是 规范化解析相对化操作。

规范化 是从分层 URI 的路径组件中删除不必要的 "."".." 段的过程。 只需删除每个 "." 段。 ".."仅当段前面有非".."段时,才会删除段。 规范化对不透明 URI 没有影响。

解析 是将一个 URI 解析为另一个 URI 的过程。 生成的 URI 以 RFC  指定的方式从两个 URI 的组件构造。2396,从原始中未指定的基 URI 获取组件。 对于分层 URI,将针对基路径解析原始路径,然后规范化。 例如,解析的结果

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

针对基 URI http://java.sun.com/j2se/1.3/ 是结果 URI

<blockquote>http://java.sun.com/j2se/1.3/docs/guide/collections/designfaq.html#28</blockquote>

解析相对 URI

<blockquote>../../../demo/jfc/SwingSet2/src/SwingSet2.java     (2) </blockquote>

针对此结果,反过来,

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

支持绝对 URI 和相对 URI 以及分层 URI 的绝对路径和相对路径的解析。 针对任何其他 URI 解析 URI file:///~calendar 只会生成原始 URI,因为它是绝对 URI。 将上面 (2) 相对于相对基 URI (1 的相对 URI 解析) 生成规范化但仍相对的 URI

<blockquote>demo/jfc/SwingSet2/src/SwingSet2.java</blockquote>

最后,相对化是分辨率的反转:对于任意两个规范化 URI u 和 v

<blockquote>u.relativize(u.resolve(v)).equals(v)  和<br>u u.resolve(.relativize(v)).equals(&) nbsp; 。<br></blockquote>

在构造包含必须尽可能相对于文档基 URI 创建的 URI 的文档时,此操作通常很有用。 例如,相对化 URI

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

针对基 URI

<blockquote>http://java.sun.com/j2se/1.3</blockquote>

生成相对 URI docs/guide/index.html

<h4> 字符类别 </h4>

RFC 2396 精确指定在 URI 引用的各个组件中允许的字符。 以下类别(大部分来自该规范)用于描述这些约束:

<blockquote><表 cellspacing=2 summary=“Describes categories alpha,digit,alphanum,unreserved,punct,reserved,escaped,and other”><tr><th valign=top>alpha</th><td>THE US-ASCII 字母字符, 'A' 通过 'Z''a' 通过 'z'</td></tr><tr><th valign=top>digit</th><td>US-ASCII 十进制数字字符, '0' 通过 '9'</td></tr><th><valign=top>alphanum</th<>td>All alpha and digit characters</td></tr><<>th valign=top> unreserved    </th><td>所有字母数字字符以及字符串 "_-!.~'()*"</td></tr><><th valign=top> punct</th><td>字符串 ",;:$&+="</td></tr<>><th valign=top> reserved</th><td>字符串中的所有标点字符以及字符串 /td/tr th valign=top 中的字符以及字符串 "?/[]@"</td></tr><><th valign=top>中的字符escaped</th><td>转义八进制数,即由百分比字符 ('%') 后跟两个十六进制数字 ('9''0'- 、'F''A'- 和-'f''a') </td></tr>><<th valign=top> other</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>

<李>

“encode”> 将字符替换为在 UTF-8 字符集中表示该字符的转义八进制数序列,从而对字符进行 编码 。 例如,) ('\u005Cu20AC' 欧元货币符号编码为 "%E2%82%AC"< (b>RFC  偏差;2396</b>,它未指定任何特定字符集。)

</李>

<李>

“quote”> 仅通过编码来 引用 非法字符。 例如,空格字符通过将它替换为 来引用它 "%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,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(&) nbsp;。 </blockquote>

对于不包含冗余语法(如  () file:///tmp/ 或主机名后没有端口 (的冒号)(如& ) 中http://java.sun.com:所示的空机构前的两个斜杠)且除必须用引号对字符进行编码之外不编码字符的任何 URI u,则以下标识也保留:

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 和 URNs </h4>

URI 是统一资源 标识符 ,而 URL 是统一资源 定位符。 因此,从抽象上讲,每个 URL 都是一个 URI,但并非每个 URI 都是一个 URL。 这是因为存在另一个 URI 子类别,统一资源 名称 (URNs) ,这些资源的名称为资源,但没有指定如何查找它们。 mailto上面显示的 、 newsisbn URI 是 URN 的示例。

URI 和 URL 之间的概念区别反映在此类和 类之间的差异中 URL

此类的实例表示 RFC 2396 定义的语法中的 URI 引用。 URI 可以是绝对 URI,也可以是相对 URI。 根据泛型语法分析 URI 字符串,而不考虑它指定的方案(如果有)。 不执行主机查找(如果有),也不构造依赖于方案的流处理程序。 相等、哈希和比较严格根据实例的字符内容进行定义。 换句话说,URI 实例只是一个结构化字符串,它支持比较、规范化、解析和相对化等与方案无关的语法操作。

相比之下,类的 URL 实例表示 URL 的语法组件以及访问它描述的资源所需的一些信息。 URL 必须是绝对的,也就是说,它必须始终指定方案。 URL 字符串根据其方案进行分析。 始终为 URL 建立流处理程序,事实上,不可能为没有可用处理程序的方案创建 URL 实例。 相等性和哈希取决于主机的方案和 Internet 地址(如果有);未定义比较。 换句话说,URL 是一个结构化字符串,它支持解析的语法操作以及查找主机和打开与指定资源的连接的网络 I/O 操作。

在 1.4 中添加。

java.net.URIJava 文档。

此页面的部分内容是基于 创建和共享的工作进行的修改,并根据 署名许可中所述的术语使用。

构造函数

URI(String)

通过分析给定字符串构造 URI。

URI(String, String, String)

从给定组件构造 URI。

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

从给定组件构造分层 URI。

URI(String, String, String, String)

从给定组件构造分层 URI。

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

从给定组件构造分层 URI。

属性

Authority

返回此 URI 的解码颁发机构组件。

Class

返回此 Object的运行时类。

(继承自 Object)
Fragment

返回此 URI 的解码片段组件。

Handle

基础 Android 实例的句柄。

(继承自 Object)
Host

返回此 URI 的主机组件。

IsAbsolute

指示此 URI 是否为绝对 URI。

IsOpaque

指示此 URI 是否不透明。

JniIdentityHashCode

表示统一资源标识符 (URI) 引用。

(继承自 Object)
JniPeerMembers

表示统一资源标识符 (URI) 引用。

Path

返回此 URI 的解码路径组件。

PeerReference

表示统一资源标识符 (URI) 引用。

(继承自 Object)
Port

返回此 URI 的端口号。

Query

返回此 URI 的解码查询组件。

RawAuthority

返回此 URI 的原始颁发机构组件。

RawFragment

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

RawPath

返回此 URI 的原始路径组件。

RawQuery

返回此 URI 的原始查询组件。

RawSchemeSpecificPart

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

RawUserInfo

返回此 URI 的原始用户信息组件。

Scheme

返回此 URI 的方案组件。

SchemeSpecificPart

返回此 URI 中特定于方案的解码部分。

ThresholdClass

此 API 支持 Mono for Android 基础结构,不应直接从代码中使用。

(继承自 Object)
ThresholdType

此 API 支持 Mono for Android 基础结构,不应直接从代码中使用。

(继承自 Object)
UserInfo

返回此 URI 的已解码的用户信息组件。

方法

Clone()

创建并返回此对象的副本。

(继承自 Object)
CompareTo(URI)

将此 URI 与另一个对象进行比较,该对象必须是 URI。

Create(String)

通过分析给定字符串创建 URI。

Dispose()

表示统一资源标识符 (URI) 引用。

(继承自 Object)
Dispose(Boolean)

表示统一资源标识符 (URI) 引用。

(继承自 Object)
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)
ToArray<T>()

表示统一资源标识符 (URI) 引用。

(继承自 Object)
ToASCIIString()

以 US-ASCII 字符串的形式返回此 URI 的内容。

ToString()

返回对象的字符串表示形式。

(继承自 Object)
ToURL()

从此 URI 构造 URL。

UnregisterFromRuntime()

表示统一资源标识符 (URI) 引用。

(继承自 Object)
Wait()

导致当前线程等待,直到它被唤醒,通常是通过 em <通知/em> 或 <em>interrupted</em>。<>

(继承自 Object)
Wait(Int64)

导致当前线程等待,直到它被唤醒,通常是通过 em <通知/em> 或 <em>interrupted</em>,或直到经过一定数量的实时。<>

(继承自 Object)
Wait(Int64, Int32)

导致当前线程等待,直到它被唤醒,通常是通过 em <通知/em> 或 <em>interrupted</em>,或直到经过一定数量的实时。<>

(继承自 Object)

显式接口实现

IComparable.CompareTo(Object)

表示统一资源标识符 (URI) 引用。

IJavaPeerable.Disposed()

表示统一资源标识符 (URI) 引用。

(继承自 Object)
IJavaPeerable.DisposeUnlessReferenced()

表示统一资源标识符 (URI) 引用。

(继承自 Object)
IJavaPeerable.Finalized()

表示统一资源标识符 (URI) 引用。

(继承自 Object)
IJavaPeerable.JniManagedPeerState

表示统一资源标识符 (URI) 引用。

(继承自 Object)
IJavaPeerable.SetJniIdentityHashCode(Int32)

表示统一资源标识符 (URI) 引用。

(继承自 Object)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

表示统一资源标识符 (URI) 引用。

(继承自 Object)
IJavaPeerable.SetPeerReference(JniObjectReference)

表示统一资源标识符 (URI) 引用。

(继承自 Object)

扩展方法

JavaCast<TResult>(IJavaObject)

执行 Android 运行时检查的类型转换。

JavaCast<TResult>(IJavaObject)

表示统一资源标识符 (URI) 引用。

GetJniTypeName(IJavaPeerable)

表示统一资源标识符 (URI) 引用。

适用于