Module java.base
Package java.net

Class URI

java.lang.Object
java.net.URI
所有已实现的接口:
Serializable, Comparable<URI>

public final class URI extends Object implements Comparable<URI>, Serializable
表示统一资源标识符(URI)引用。

除下面指出的一些小偏差外,此类的一个实例表示由RFC 2396:统一资源标识符(URI):通用语法定义的URI引用,由RFC 2732:URL中文字面IPv6地址的格式修改。文字面IPv6地址格式还支持scope_ids。有关scope_ids的语法和用法,请参见此处。此类提供了从其组件创建URI实例或通过解析其字符串形式创建URI实例的构造函数,用于访问实例的各个组件的方法,以及用于规范化、解析和相对化URI实例的方法。此类的实例是不可变的。

URI语法和组件

在最高级别上,字符串形式的URI引用(以下简称“URI”)的语法如下
[scheme:]scheme-specific-part[#fragment]
其中方括号[...]表示可选组件,字符:#代表它们自身。

绝对URI指定了一个方案;不是绝对的URI被称为相对。根据它们是不透明还是分层,URI也被分类。

不透明URI是一个绝对URI,其方案特定部分不以斜杠字符('/')开头。不透明URI不需要进一步解析。一些不透明URI的示例包括:

  • mailto:java-net@www.example.com
  • news:comp.lang.java
  • urn:isbn:096139210x

分层URI要么是一个方案特定部分以斜杠字符开头的绝对URI,要么是一个不指定方案的相对URI。一些分层URI的示例包括:

http://example.com/languages/java/
sample/a/index.html#28
../../demo/b/index.html
file:///~/calendar

分层URI根据以下语法进一步解析

[scheme:][//authority][path][?query][#fragment]
其中字符:/?#代表它们自身。分层URI的方案特定部分由方案和片段组件之间的字符组成。

分层URI的权限组件,如果指定,可以是基于服务器基于注册表。基于服务器的权限根据熟悉的语法解析

[user-info@host[:port]
其中字符@:代表它们自身。当前使用的几乎所有URI方案都是基于服务器的。不按照这种方式解析的权限组件被视为基于注册表的。

分层URI的路径组件本身被称为绝对的,如果它以斜杠字符('/')开头;否则它是相对的。始终是绝对的分层URI的路径(尽管可能为空)和指定权限的URI的路径始终是绝对的。

总之,一个URI实例有以下九个组件:

描述了URI的组件:方案、方案特定部分、权限、用户信息、主机、端口、路径、查询、片段
组件 类型
方案 String
方案特定部分 String
权限 String
用户信息 String
主机 String
端口 int
路径 String
查询 String
片段 String
在给定实例中,任何特定组件要么是未定义,要么是已定义具有不同的值。未定义的字符串组件由null表示,未定义的整数组件由-1表示。字符串组件可以定义为空字符串作为其值;这与该组件未定义不同。

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

URI实例上的操作

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

规范化是从分层URI的路径组件中删除不必要的"."".."段的过程。每个"."段都被简单地删除。只有在".."段之前是非".."段时,才会删除".."段。规范化对不透明URI没有影响。

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

sample/a/index.html#28                  (1)
相对于基本URIhttp://example.com/languages/java/的结果URI是结果URI
http://example.com/languages/java/sample/a/index.html#28
解析相对URI
../../demo/b/index.html    (2)
相对于此结果得到
http://example.com/languages/java/demo/b/index.html
支持解析绝对和相对URI,以及分层URI的绝对和相对路径。将URIfile:///~calendar解析为任何其他URI只会产生原始URI,因为它是绝对的。将相对URI(2)解析为相对基本URI(1)产生规范化但仍然是相对的URI
demo/b/index.html

相对化最终可以被视为解析的逆操作。让u是以斜杠字符('/')结尾的任何规范化绝对URI,v是不以句点字符('.')或斜杠字符('/')开头的任何规范化相对URI。那么,以下语句为真:

u.relativize(u.resolve(v)).equals(v)
u是以斜杠字符('/')结尾的任何规范化绝对URI,v是任何规范化绝对URI。那么,以下语句为真:
u.resolve(u.relativize(v)).equals(v)
此操作在构造包含必须尽可能相对于文档的基本URI的URI的文档时通常很有用。例如,将URI
http://example.com/languages/java/sample/a/index.html#28
相对于基本URI
http://example.com/languages/java/
得到相对URIsample/a/index.html#28

字符类别

RFC 2396精确指定了URI引用的各个组件中允许的字符。下面使用的以下类别大多数取自该规范,用于描述这些约束:
描述了类别alpha,digit,alphanum,unreserved,punct,reserved,escaped和other
类别 描述
alpha US-ASCII字母字符,'A''Z''a''z'
digit US-ASCII十进制数字字符,'0''9'
alphanum 所有alphadigit字符
unreserved 所有alphanum字符以及字符串"_-!.~'()*"中的字符
punct 字符串",;:$&+="中的字符
reserved 所有punct字符以及字符串"?/[]@"中的字符
escaped 转义的八位组,即由百分号字符('%')后跟两个十六进制数字('0'-'9''A'-'F''a'-'f')组成的三元组
other 不在US-ASCII字符集中的Unicode字符,不是控制字符(根据Character.isISOControl方法),也不是空格字符(根据Character.isSpaceChar方法)  与RFC 2396的偏差,RFC 2396仅限于US-ASCII)

所有合法URI字符的集合包括unreservedreservedescapedother字符。

转义八位组、引号、编码和解码

RFC 2396允许转义八位组出现在用户信息、路径、查询和片段组件中。在URI中,转义有两个目的:
  • 当要求URI严格遵守RFC 2396不包含任何other字符时,对非US-ASCII字符进行编码

  • 对在组件中否则非法的字符进行引用。用户信息、路径、查询和片段组件在被视为合法和非法字符方面略有不同。

该类别中的这些目的通过三个相关操作实现:
  • 通过用表示该字符在UTF-8字符集中的转义八位组序列替换字符来对字符进行编码。例如,欧元货币符号('\u20AC')被编码为"%E2%82%AC"与RFC 2396的偏差,RFC 2396不指定任何特定的字符集。)

  • 非法字符通过简单地进行编码进行引用。例如,空格字符通过替换为"%20"进行引用。UTF-8包含US-ASCII,因此对于US-ASCII字符,此转换正好符合RFC 2396所需的效果。

  • 通过用其在UTF-8字符集中表示的字符序列替换转义八位组序列来对转义八位组序列进行解码。UTF-8包含US-ASCII,因此解码的效果是去引用任何引用的US-ASCII字符以及解码任何编码的非US-ASCII字符。如果在解码转义八位组时发生解码错误,则错误的八位组将被替换为'\uFFFD',即Unicode替换字符。

这些操作通过该类的构造函数和方法公开如下:
  • 单参数构造函数要求其参数中的任何非法字符都被引用,并保留任何已存在的转义八位组和other字符。

  • 多参数构造函数根据它们出现的组件要求引用非法字符。百分号字符('%')始终由这些构造函数引用。任何other字符都将被保留。

  • getRawUserInfogetRawPathgetRawQuerygetRawFragmentgetRawAuthoritygetRawSchemeSpecificPart方法以原始形式返回它们对应组件的值,而不解释任何转义八位组。这些方法返回的字符串可能包含转义八位组和other字符,不会包含任何非法字符。

  • getUserInfogetPathgetQuerygetFragmentgetAuthoritygetSchemeSpecificPart方法解码其对应组件中的任何转义八位组。这些方法返回的字符串可能包含other字符和非法字符,不会包含任何转义八位组。

  • toString方法返回一个带有所有必要引号的URI字符串,但可能包含other字符。

  • toASCIIString方法返回一个完全引用和编码的URI字符串,不包含任何other字符。

身份

对于任何URI u,总是成立:
new URI(u.toString()).equals(u) .
对于不包含冗余语法的任何URI u(例如在空权限之前有两个斜杠(如file:///tmp/)或主机名后跟一个冒号但没有端口(如http://www.example.com:)的URI),并且不对除必须引用的字符之外的字符进行编码,还有以下身份:
     new URI(u.getScheme(),
             u.getSchemeSpecificPart(),
             u.getFragment())
     .equals(u)
在所有情况下,
     new URI(u.getScheme(),
             u.getAuthority(),
             u.getPath(), u.getQuery(),
             u.getFragment())
     .equals(u)
如果 u 是分层的,并且
     new URI(u.getScheme(),
             u.getUserInfo(), u.getHost(), u.getPort(),
             u.getPath(), u.getQuery(),
             u.getFragment())
     .equals(u)
如果 u 是分层的并且没有权限或具有基于服务器的权限。

URI、URL和URN

URI是统一资源标识符,而URL是统一资源定位符。因此,从抽象的角度来看,每个URL都是一个URI,但并非每个URI都是URL。这是因为还有另一种URI子类,统一资源名称(URNs),它们命名资源但不指定如何定位它们。上面显示的mailtonewsisbn URI是URN的示例。

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

该类的实例代表了RFC 2396定义的语法意义上的URI引用。URI可以是绝对的或相对的。URI字符串根据通用语法进行解析,而不考虑它指定的方案(如果有)。不执行主机(如果有)的查找,并且不构造依赖于方案的流处理程序。相等性、哈希和比较严格定义为实例的字符内容。换句话说,URI实例仅仅是支持比较、规范化、解析和相对化的语法、与方案无关的操作的结构化字符串。

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

API 注释:
处理文件路径和文件URI的应用程序应该非常小心地使用适当的方法在两者之间进行转换。可以使用Path.of(URI)工厂方法和File(URI)构造函数来从文件URI创建PathFile对象。可以使用Path.toUri()File.toURI()来从文件路径创建一个URI。应用程序永远不应尝试从FilePath实例的直接字符串表示构造、解析或解析URI

URL或URI的某些组件,如userinfo,可能被滥用以构造误导性的URL或URI。处理URL或URI的应用程序应考虑RFC3986第7节中建议的建议。

自版本:
1.4
外部规范
参见:
  • Constructor Details

    • URI

      public URI(String str) throws URISyntaxException
      通过解析给定的字符串构造URI。

      此构造函数完全按照RFC 2396附录 A中的语法指定解析给定的字符串,除了以下偏差:

      • 允许空的授权组件,只要它后面跟着一个非空路径、查询组件或片段组件。这允许解析诸如"file:///foo/bar"这样的URI,尽管RFC 2396的意图似乎是如此,尽管语法不允许。如果授权组件为空,则用户信息、主机和端口组件未定义。

      • 允许空的相对路径;这似乎是RFC 2396的意图,尽管语法不允许。这种偏差的主要后果是独立片段,如"#foo"解析为具有空路径和给定片段的相对URI,并且可以有用地解析为基本URI。

      • 主机组件中的IPv4地址将严格解析,如RFC 2732所指定:点分四进制地址的每个元素必须不超过三个十进制数字。此外,每个元素进一步受限于值不大于255。

      • 主机组件中仅包含单个域标签的主机名允许以alphanum字符开头。这似乎是RFC 2396第3.2.2节的意图,尽管语法不允许。这种偏差的后果是分层URI的授权组件,如s://123,将解析为基于服务器的授权。

      • 主机组件中允许IPv6地址。IPv6地址必须用方括号('['']')括起来,如RFC 2732所指定。IPv6地址本身必须根据RFC 2373进行解析。IPv6地址进一步受限于描述不超过十六个字节地址信息的约束,这是RFC 2373中隐含的约束,但不能在语法中表达。

      • 在RFC 2396允许escaped八位组的地方,允许other类别的字符,即在用户信息、路径、查询和片段组件以及如果授权是基于注册表的情况下的授权组件中。这允许URI包含超出US-ASCII字符集中字符的Unicode字符。

      参数:
      str - 要解析为URI的字符串
      抛出:
      NullPointerException - 如果strnull
      URISyntaxException - 如果给定的字符串违反了RFC 2396,如上述偏差所增补的
      外部规范
    • URI

      public URI(String scheme, String userInfo, String host, int port, String path, String query, String fragment) throws URISyntaxException
      从给定的组件构造分层URI。

      如果提供了方案,则路径(如果也提供)必须为空或以斜杠字符('/')开头。否则,可以通过为相应参数传递null或在port参数的情况下传递-1来留下新URI的组件未定义。

      此构造函数首先根据RFC 2396第5.2节规定的规则从给定的组件构建URI字符串,步骤7如下:

      1. 最初,结果字符串为空。

      2. 如果提供了方案,则将其附加到结果,后跟冒号字符(':')。

      3. 如果提供了用户信息、主机或端口,则附加字符串"//"

      4. 如果提供了用户信息,则附加,后跟商业-at字符('@')。不在未保留标点转义其他类别中的任何字符都会被引用

      5. 如果提供了主机,则附加。如果主机是文字IPv6地址但未包含在方括号('['']')中,则添加方括号。

      6. 如果提供了端口号,则附加冒号字符(':'),后跟十进制端口号。

      7. 如果提供了路径,则附加。不在未保留标点转义其他类别中的任何字符,并且不等于斜杠字符('/')或商业-at字符('@')的字符都会被引用。

      8. 如果提供了查询,则附加问号字符('?'),后跟查询。任何不是合法URI字符的字符都会被引用。

      9. 最后,如果提供了片段,则附加井号字符('#'),后跟片段。任何不是合法URI字符的字符都会被引用。

      然后将生成的URI字符串解析为通过调用URI(String)构造函数然后在结果上调用parseServerAuthority()方法来创建新的URI实例;这可能会导致抛出URISyntaxException

      参数:
      scheme - 方案名称
      userInfo - 用户名和授权信息
      host - 主机名
      port - 端口号
      path - 路径
      query - 查询
      fragment - 片段
      抛出:
      URISyntaxException - 如果提供了方案和路径,但路径是相对的,如果从给定组件构造的URI字符串违反了RFC 2396,或者如果字符串的权限组件存在但无法解析为基于服务器的权限
      外部规范
    • URI

      public URI(String scheme, String authority, String path, String query, String fragment) throws URISyntaxException
      从给定的组件构造分层URI。

      如果提供了方案,则路径(如果也提供)必须为空或以斜杠字符('/')开头。否则,可以通过为相应参数传递null来留下新URI的组件未定义。

      此构造函数首先根据RFC 2396第5.2节规定的规则从给定的组件构建URI字符串,步骤7如下:

      1. 最初,结果字符串为空。

      2. 如果提供了方案,则将其附加到结果,后跟冒号字符(':')。

      3. 如果提供了权限,则附加字符串"//",后跟权限。如果权限包含文字IPv6地址,则地址必须用方括号('['']')括起来。不在未保留标点转义其他类别中的任何字符,并且不等于商业-at字符('@')的字符都会被引用

      4. 如果提供了路径,则附加。不在未保留标点转义其他类别中的任何字符,并且不等于斜杠字符('/')或商业-at字符('@')的字符都会被引用。

      5. 如果提供了查询,则附加问号字符('?'),后跟查询。任何不是合法URI字符的字符都会被引用。

      6. 最后,如果提供了片段,则附加井号字符('#'),后跟片段。任何不是合法URI字符的字符都会被引用。

      然后将生成的URI字符串解析为通过调用URI(String)构造函数然后在结果上调用parseServerAuthority()方法来创建新的URI实例;这可能会导致抛出URISyntaxException

      参数:
      scheme - 方案名称
      authority - 权限
      path - 路径
      query - 查询
      fragment - 片段
      抛出:
      URISyntaxException - 如果提供了方案和路径,但路径是相对的,如果从给定组件构造的URI字符串违反了RFC 2396,或者如果字符串的权限组件存在但无法解析为基于服务器的权限
      外部规范
    • URI

      public URI(String scheme, String host, String path, String fragment) throws URISyntaxException
      从给定的组件构造分层URI。

      通过传递null,可以留下一个组件未定义。

      此便利构造函数的工作方式如同调用七参数构造函数一样:

      new URI(scheme, null, host, -1, path, null, fragment);
      参数:
      scheme - 方案名称
      host - 主机名
      path - 路径
      fragment - 片段
      抛出:
      URISyntaxException - 如果从给定组件构造的URI字符串违反了RFC 2396
    • URI

      public URI(String scheme, String ssp, String fragment) throws URISyntaxException
      从给定的组件构造URI。

      通过传递null,可以留下一个组件未定义。

      此构造函数首先使用给定的组件构建URI字符串,如下所示:

      1. 最初,结果字符串为空。

      2. 如果提供了方案,则将其附加到结果,后跟冒号字符(':')。

      3. 如果提供了方案特定部分,则附加。任何不是合法URI字符的字符都会引用

      4. 最后,如果提供了片段,则附加井号字符('#')到字符串,后跟片段。任何不是合法URI字符的字符都会被引用。

      然后解析生成的URI字符串,以便通过调用URI(String)构造函数创建新的URI实例;这可能会导致抛出URISyntaxException

      参数:
      scheme - 方案名称
      ssp - 方案特定部分
      fragment - 片段
      抛出:
      URISyntaxException - 如果从给定组件构造的URI字符串违反了RFC 2396
  • Method Details

    • create

      public static URI create(String str)
      通过解析给定的字符串创建URI。

      此便利工厂方法的工作方式如同调用URI(String)构造函数;构造函数抛出的任何URISyntaxException都会被捕获并包装在新的IllegalArgumentException对象中,然后抛出。

      此方法适用于已知给定字符串是合法URI的情况,例如在程序中声明的URI常量,因此如果字符串无法解析为URI,则会被视为编程错误。应该在从用户输入或其他可能容易出错的来源构造URI的情况下使用直接抛出URISyntaxException的构造函数。

      参数:
      str - 要解析为URI的字符串
      返回:
      新的URI
      抛出:
      NullPointerException - 如果strnull
      IllegalArgumentException - 如果给定的字符串违反了RFC 2396
    • parseServerAuthority

      public URI parseServerAuthority() throws URISyntaxException
      尝试将此URI的授权组件(如果已定义)解析为用户信息、主机和端口组件。

      如果此URI的授权组件已被识别为基于服务器的,则已经将其解析为用户信息、主机和端口组件。在这种情况下,或者如果此URI没有授权组件,则此方法简单地返回此URI。

      否则,此方法再次尝试将授权组件解析为用户信息、主机和端口组件,并抛出描述为什么无法以这种方式解析授权组件的异常。

      提供此方法是因为在RFC 2396中指定的通用URI语法不能总是区分格式错误的基于服务器的授权和合法的基于注册表的授权。因此,必须将前者的某些实例视为后者的实例。例如,URI字符串"//foo:bar"中的授权组件不是合法的基于服务器的授权,但作为基于注册表的授权是合法的。

      在许多常见情况下,例如在处理已知为URN或URL的URI时,使用的分层URI将始终是基于服务器的。因此,它们必须被解析为这样的URI或被视为错误。在这些情况下,可以使用类似于以下语句

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

      来确保u始终引用具有基于服务器的授权且具有正确的用户信息、主机和端口组件的URI。调用此方法还可以确保如果授权无法以这种方式解析,则可以基于抛出的异常发出适当的诊断消息。

      返回:
      已将授权字段解析为基于服务器的授权的URI
      抛出:
      URISyntaxException - 如果此URI的授权组件已定义但无法根据RFC 2396解析为基于服务器的授权
      外部规范
    • normalize

      public URI normalize()
      规范化此URI的路径。

      如果此URI是不透明的,或者其路径已经是正常形式,则返回此URI。否则,将构造一个新的URI,其路径与通过以与RFC 2396第5.2节,步骤6,子步骤c到f一致的方式规范化此URI的路径相同;即:

      1. 删除所有"."段。

      2. 如果".."段前面是非".."段,则删除这两个段。重复此步骤,直到不再适用为止。

      3. 如果路径是相对的,并且其第一个段包含冒号字符(':'),则会添加一个"."段。这可以防止具有路径如"a:b/c/d"的相对URI后来被重新解析为具有方案为"a"且方案特定部分为"b/c/d"的不透明URI。(与RFC 2396的偏差)

      如果不足够的非".."段在它们之前以允许删除它们,则规范化路径将以一个或多个".."段开头。如果步骤3中插入了一个"."段,则规范化路径将以一个"."段开头。否则,规范化路径将不包含任何"."".."段。

      返回:
      与此URI等效的URI,但其路径为正常形式
      外部规范
    • resolve

      public URI resolve(URI uri)
      根据此URI解析给定的URI。

      如果给定的URI已经是绝对的,或者此URI是不透明的,则返回给定的URI。

      如果给定的URI的片段组件已定义,其路径组件为空,并且其方案、授权和查询组件未定义,则将返回具有给定片段但所有其他组件均等于此URI的URI。这允许将表示独立片段引用的URI(例如"#foo")有用地解析为基础URI。

      否则,此方法将按照与RFC 2396第5.2节一致的方式构造一个新的分层URI;即:

      1. 使用此URI的方案和给定URI的查询和片段组件构造一个新的URI。

      2. 如果给定URI具有授权组件,则新URI的授权和路径取自给定URI。

      3. 否则,新URI的授权组件从此URI复制,并且其路径如下计算:

        1. 如果给定URI的路径是绝对的,则新URI的路径取自给定URI。

        2. 否则,给定URI的路径是相对的,因此新URI的路径通过将给定URI的路径相对于此URI的路径解析来计算。这是通过连接除了此URI的路径的最后一个段之外的所有部分(如果有的话)与给定URI的路径,然后像调用normalize方法一样对结果进行规范化来完成的。

      参数:
      uri - 要根据此URI解析的URI
      返回:
      结果URI
      抛出:
      NullPointerException - 如果urinull
      外部规范
    • resolve

      public URI resolve(String str)
      通过解析给定的字符串构造新的URI,然后根据此URI解析它。 resolve (URI. create (str))

      参数:
      str - 要解析为URI的字符串
      返回:
      结果URI
      抛出:
      NullPointerException - 如果strnull
      IllegalArgumentException - 如果给定的字符串违反了RFC 2396
    • relativize

      public URI relativize(URI uri)
      相对化给定的URI相对于此URI。

      1. 如果此URI或给定的URI是不透明的,或者两个URI的方案和授权组件不相同,或者此URI的路径不是给定URI的路径的前缀,则返回给定的URI。

      2. 否则,将构造一个新的相对分层URI,其中查询和片段组件取自给定的URI,并且路径组件通过从给定URI的路径开头删除此URI的路径来计算。

      参数:
      uri - 要相对于此URI进行相对化的URI
      返回:
      结果URI
      抛出:
      NullPointerException - 如果urinull
    • toURL

      public URL toURL() throws MalformedURLException
      从此URI构造URL。 new URL(this.toString())

      返回:
      从此URI构造的URL
      抛出:
      IllegalArgumentException - 如果此URL不是绝对的
      MalformedURLException - 如果找不到URL的协议处理程序,或者在构造URL时发生其他错误
    • getScheme

      public String getScheme()
      返回此URI的方案组件。 alphanum类别中的字符和字符串 "-.+"。方案始终以 alpha字符开头。

      返回:
      此URI的方案组件,如果未定义方案则为null
    • isAbsolute

      public boolean isAbsolute()
      告诉此URI是否为绝对的。

      返回:
      如果此URI是绝对的,则为true
    • isOpaque

      public boolean isOpaque()
      告诉此URI是否为不透明的。
      返回:
      如果此URI是不透明的,则为true
    • getRawSchemeSpecificPart

      public String getRawSchemeSpecificPart()
      返回此URI的原始方案特定部分。方案特定部分永远不会未定义,尽管可能为空。

      返回:
      此URI的原始方案特定部分(永远不为null
    • getSchemeSpecificPart

      public String getSchemeSpecificPart()
      返回此URI的解码方案特定部分。 getRawSchemeSpecificPart方法返回的字符串,只是所有转义的八进制数序列都被 解码

      返回:
      此URI的解码方案特定部分(永远不为null
    • getRawAuthority

      public String getRawAuthority()
      返回此URI的原始权限组件。

      URI的权限组件(如果已定义)仅包含商业符号('@')和未保留标点转义其他类别中的字符。如果权限是基于服务器的,则进一步限制为具有有效的用户信息、主机和端口组件。

      返回:
      此URI的原始权限组件,如果权限未定义则返回null
    • getAuthority

      public String getAuthority()
      返回此URI的解码权限组件。

      此方法返回的字符串与getRawAuthority方法返回的字符串相同,只是所有转义八位组的序列都被解码了。

      返回:
      此URI的解码权限组件,如果权限未定义则返回null
    • getRawUserInfo

      public String getRawUserInfo()
      返回此URI的原始用户信息组件。

      URI的用户信息组件(如果已定义)仅包含未保留标点转义其他类别中的字符。

      返回:
      此URI的原始用户信息组件,如果用户信息未定义则返回null
    • getUserInfo

      public String getUserInfo()
      返回此URI的解码用户信息组件。

      此方法返回的字符串与getRawUserInfo方法返回的字符串相同,只是所有转义八位组的序列都被解码了。

      返回:
      此URI的解码用户信息组件,如果用户信息未定义则返回null
    • getHost

      public String getHost()
      返回此URI的主机组件。

      URI的主机组件(如果已定义)将具有以下形式之一:

      • 由一个或多个由句点字符('.')分隔的标签组成的域名,可选地后跟一个句点字符。每个标签由字母数字字符以及连字符字符('-')组成,尽管连字符永远不会出现在标签的第一个或最后一个字符中。由两个或更多标签组成的域名的最右边的标签以字母字符开头。

      • 形式为数字+.数字+.数字+.数字+的点分四段IPv4地址,其中没有数字序列长于三个字符,也没有序列的值大于255。

      • 用方括号('['']')括起来的IPv6地址,由十六进制数字、冒号字符(':')和可能包含的嵌入IPv4地址组成。IPv6地址的完整语法在RFC 2373:IPv6地址架构中指定。

      URI的主机组件不能包含转义的八位组,因此此方法不执行任何解码。
      返回:
      此URI的主机组件,如果主机未定义则返回null
      外部规范
    • getPort

      public int getPort()
      返回此URI的端口号。

      URI的端口组件(如果已定义)是一个非负整数。

      返回:
      此URI的端口组件,如果端口未定义则返回-1
    • getRawPath

      public String getRawPath()
      返回此URI的原始路径组件。

      URI的路径组件(如果已定义)仅包含斜杠字符('/')、商业符号('@')和未保留标点转义其他类别中的字符。

      返回:
      此URI的路径组件,如果路径未定义则返回null
    • getPath

      public String getPath()
      返回此URI的解码路径组件。

      此方法返回的字符串与getRawPath方法返回的字符串相同,只是所有转义八位组的序列都被解码了。

      返回:
      此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方法返回的字符串相同,只是所有转义八位组的序列都被解码了。

      返回:
      此URI的解码片段组件,如果片段未定义则返回null
    • equals

      public boolean equals(Object ob)
      用另一个对象测试此URI是否相等。

      如果给定的对象不是URI,则此方法立即返回false

      要考虑两个URI是否相等,要求两者都是不透明的或都是分层的。它们的方案必须都未定义,或者相等而不区分大小写。它们的片段必须都未定义,或者相等。

      要考虑两个不透明URI是否相等,它们的特定于方案的部分必须相等。

      要考虑两个分层URI是否相等,它们的路径必须相等,它们的查询必须都未定义,或者相等。它们的权限必须都未定义,或者都是基于注册表的,或者都是基于服务器的。如果它们的权限已定义且是基于注册表的,则它们必须相等。如果它们的权限已定义且是基于服务器的,则它们的主机必须相等而不区分大小写,它们的端口号必须相等,它们的用户信息组件必须相等。

      在测试两个URI的用户信息、路径、查询、片段、权限或特定于方案的部分是否相等时,将比较这些组件的原始形式而不是编码形式,并且将比较转义八位组的十六进制数字而不区分大小写。

      此方法满足Object.equals方法的一般合同。

      覆盖:
      equals 在类 Object
      参数:
      ob - 要将此对象与之比较的对象
      返回:
      如果给定对象是与此URI相同的URI,则返回true
      参见:
    • hashCode

      public int hashCode()
      返回此URI的哈希码值。哈希码基于所有URI的组件,并满足Object.hashCode方法的一般合同。
      覆盖:
      hashCode 在类 Object
      返回:
      此URI的哈希码值
      参见:
    • compareTo

      public int compareTo(URI that)
      比较此URI与另一个对象,该对象必须是一个URI。

      当比较两个URI的对应组件时,如果一个组件未定义但另一个定义了,则第一个被认为小于第二个。除非另有说明,字符串组件根据它们的自然、区分大小写的顺序进行排序,这是由String.compareTo方法定义的。需要编码的字符串组件通过比较它们的原始形式而不是编码形式进行比较,转义八位组的十六进制数字进行比较时不考虑大小写。

      URI的排序定义如下:

      • 具有不同方案的两个URI根据它们的方案的顺序进行排序,不考虑大小写。

      • 具有相同方案的层次URI被认为小于具有相同方案的不透明URI。

      • 具有相同方案的两个不透明URI根据它们的特定于方案的部分的顺序进行排序。

      • 具有相同方案和特定于方案的部分的两个不透明URI根据它们的片段的顺序进行排序。

      • 具有相同方案的两个层次URI根据它们的权限组件的顺序进行排序:

        • 如果两个权限组件都是基于服务器的,则根据它们的用户信息组件对URI进行排序;如果这些组件相同,则根据它们的主机的顺序进行排序,不考虑大小写;如果主机相同,则根据它们的端口的顺序进行排序。

        • 如果一个或两个权限组件是基于注册表的,则根据它们的权限组件的顺序进行排序。

      • 最后,具有相同方案和权限组件的两个层次URI根据它们的路径的顺序进行排序;如果它们的路径相同,则根据它们的查询的顺序进行排序;如果查询相同,则根据它们的片段的顺序进行排序。

      此方法满足Comparable.compareTo方法的一般合同。

      指定者:
      compareTo 在接口 Comparable<URI>
      参数:
      that - 要比较此URI的对象
      返回:
      如果此URI小于给定的URI,则返回负整数,如果相等,则返回零,如果大于,则返回正整数
      抛出:
      ClassCastException - 如果给定的对象不是URI
    • toString

      public String toString()
      将此URI的内容作为字符串返回。

      如果此URI是通过调用此类中的构造函数之一创建的,则返回与原始输入字符串等效的字符串,或者根据原始给定的组件计算的字符串。否则,此URI是通过规范化、解析或相对化创建的,因此根据RFC 2396第5.2节第7步中指定的规则从此URI的组件构造字符串。

      覆盖:
      toString 在类 Object
      返回:
      此URI的字符串形式
      外部规范
    • toASCIIString

      public String toASCIIString()
      将此URI的内容作为US-ASCII字符串返回。

      如果此URI不包含任何字符在other类别中,则调用此方法将返回与调用toString方法相同的值。否则,此方法的工作方式就好像调用该方法,然后对结果进行编码

      返回:
      此URI的字符串形式,根据需要进行编码,以便只包含US-ASCII字符