Java Java类
此类提供从其组件创建 URI 实例或通过解析这些组件的字符串形式来访问和检索 URI 实例的不同组件的方法。
什么是 URI?
URI 代表统一资源标识符。统一资源标识符是用于标识特定资源的字符序列。它支持使用特定协议在网络上进行资源表示的交互。
URI、URL 和 URN:有什么区别?
您一定会想到的问题是,如果 URI 标识了一个资源,那么 URL 有什么作用?人们经常互换使用这些术语,但这是不正确的。根据蒂姆·伯纳斯·李
“统一资源标识符 (URI) 是一个紧凑的字符序列,用于标识抽象或物理资源。”
“URI 可以进一步分类为定位器、名称或两者兼而有之。术语“统一资源定位器”(URL)是指 URI 的子集,它通过其主要访问机制(例如,它们的网络“位置”)的表示来标识资源,而不是通过名称或其他属性来标识资源( s) 该资源。术语“统一资源名称”(URN)指的是 URI 的子集,即使资源不再存在或变得不可用,也需要保持全局唯一性和持久性。”
例如,
https://www.geeksforgeeks.org/url-class-java-examples/
表示一个 URL,因为它告诉我们可以在网络上找到 url 类文章的确切位置。
url-class-java-examples
表示一个 URN,因为它不告诉任何有关位置的信息,而只是为资源提供一个唯一的名称。
URI 类的对象和 URL 类的区别在于,URI字符串的解析只考虑语法,在创建时不进行主机查找。两个 URI 对象的比较仅根据字符中包含的字符串进行。但另一方面,一个 URL字符串是用某种方案解析的,两个 URL 对象的比较是通过查看网络上的实际资源来执行的。
URI 语法:
scheme:[//[user:password@]host[:port]][/]path[?query][#fragment]
- scheme : scheme 组件列出了与 URI 关联的协议。在某些方案中,“//”是必需的,而另一些则不需要。
abc://admin:admin@geeksforgeeks.org:1234/path/data ?key=value&key2=value2#fragid1
- 权威:权威组件由几个组件组成-身份验证部分,主机和可选的端口号,前面带有':'。身份验证部分包括用户名和密码。主机可以是任何 IP 地址。
abc://admin:admin@geeksforgeeks.org:1234/path/data ?key=value&key2=value2#fragid1
- path :路径表示一个字符串,其中包含服务器内到资源的地址。
abc://admin:admin@geeksforgeeks.org:1234/path/data ?key=value&key2=value2#fragid1
- 查询:查询表示非分层数据,通常用于搜索特定资源的查询。它们用“?”隔开从前面的部分。
abc://admin:admin@geeksforgeeks.org:1234/path/data ?key=value&key2=value2#fragid1
- 片段:片段用于将辅助资源标识为页面中的标题或子标题等。
abc://admin:admin@geeksforgeeks.org:1234/path/data ?key=value&key2=value2#fragid1
构造函数:
- URI(String str) :通过解析指定的字符串构造一个 URI 对象。解析时使用的语法是 RFC 2396 附录 A 中指定的语法。
Syntax :public URI(String str) throws URISyntaxException Parameters : str : String to be parsed into URI Throws : URISyntaxException : If the string violates RFC 2396
- URI(String scheme, String ssp, String fragment) :从给定的组件构造一个 URI。通过传递 null 可以使组件保持未定义。最初,结果字符串为空。如果方案不为空,则附加。同样,如果提供,则附加 ssp 和片段部分。
Syntax :public URI(String scheme, String ssp, String fragment) throws URISyntaxException Parameters : scheme : scheme name ssp : scheme-specific part fragment : fragment part Throws : URISyntaxException : If the URI string constructed from the given components violates RFC 2396
类似地,根据创建时已知的组件提供其他构造函数。
- URI(字符串方案,字符串用户信息,字符串主机,int端口,字符串路径,
字符串查询,字符串片段)Syntax :public URI(String scheme, String userInfo, String host, int port, String path, String query, String fragment) Parameters : scheme : string representing scheme userInfo : userinfo of URI host : host component of URI port : listening port number path : path of URI query : String representing the query part fragment :optional fragment
- URI(字符串方案,字符串主机,字符串路径,字符串片段)
Syntax :public URI(String scheme, String host, String path, String fragment) Parameters : scheme : string representing scheme host : host component of URI path : path of URI fragment :optional fragment
- URI(字符串方案、字符串权限、字符串路径、字符串查询、字符串片段)
Syntax :public URI(String scheme, String authority, String path, String query, String fragment) Parameters : scheme : string representing scheme authority : authority path : path of URI query : String representing the query part
方法 :
- create() :创建一个新的 URI 对象。该方法可以称为伪构造函数。它被提供用于确定给定字符串将解析为 URI 对象并且如果它不解析将被视为程序员错误的情况。
Syntax : public static URI create(String str) Parameters : str : String to be parsed as URI
- parseServerAuthority() :此方法用于解析 URI 的权限组件(如果提供给用户信息、主机和端口组件)。此方法返回一个 URI 对象,其权限字段已被解析为基于服务器的权限。
Syntax : public URI parseServerAuthority()
- normalize() :规范化这个 URI 的路径。 URI 是通过规范化与 RFC 2396 一致的 URI 路径构造的。返回规范化的 URI 对象。
Syntax : public URI normalize()
- resolve() :用这个 URI 解析给定的 URI。以与 RFC 2396 一致的方式返回新的分层 URI。
Syntax : public URI resolve(URI uri) Parameters : uri : URI to be resolved
另一个以字符串为参数的重载方法,相当于调用resolve(URI.create(str))。
Syntax : public URI resolve(String str) Parameters : str : String to be parsed as URI
- relativize() :将给定的 URI 与此 URI 相对化。
Syntax : public URI relativize(URI uri)
参数 :
uri : 相对化的 URI - toURL() :从这个 URI 构造一个 URL。
Syntax : public URL toURL() throws MalformedURLException Throws : MalformedURLException : If error occurs while constructing URL
- getScheme() :返回 URI 的方案组件
Syntax : public String getScheme()
- getRawSchemeSpecificPart() :返回 URI 的原始方案特定组件。
Syntax : public String getRawSchemeSpecificPart()
- getSchemeSpecificPart() :返回 URI 的解码方案特定组件
Syntax : public String getSchemeSpecificPart()
- getRawAuthority() :返回 URI 的权限组件。如果权限是基于服务器的,则返回更多用户信息、主机和端口组件。
Syntax : public String getRawAuthority()
- getAuthority() :返回与上述方法完全相同的结果,但解码形式除外。
Syntax : public String getAuthority()
- getRawUserInfo() :返回 URI 的用户信息组件,如果未定义,则返回 null。
Syntax : public String getRawUserInfo()
- getUserInfo() :以解码形式返回 URI 的用户信息组件,如果未定义,则返回 null。
Syntax : public String getUserInfo()
Java实现:
// Java program to illustrate various // URI class methods import java.net.*; class uridemo1 { public static void main(String[] args) throws Exception { String uribase = "https://www.geeksforgeeks.org/"; String urirelative = "languages/../java"; String str = "https://www.google.co.in/?gws_rd=ssl#"+"" + "q=networking+in+java+geeksforgeeks"+"" +"&spf=1496918039682"; // Constructor to create a new URI // by parsing the string URI uriBase = new URI(uribase); // create() method URI uri = URI.create(str); // toString() method System.out.println("Base URI = " + uriBase.toString()); URI uriRelative = new URI(urirelative); System.out.println("Relative URI = " + uriRelative.toString()); // resolve() method URI uriResolved = uriBase.resolve(uriRelative); System.out.println("Resolved URI = " + uriResolved.toString()); // relativized() method URI uriRelativized = uriBase.relativize(uriResolved); System.out.println("Relativized URI = " + uriRelativized.toString()); // normalize() method System.out.println(uri.normalize().toString()); // getScheme() method System.out.println("Scheme = " + uri.getScheme()); // getRawShemeSpecific() method System.out.println("Raw Scheme = " + uri.getRawSchemeSpecificPart()); // getSchemeSpecificPart() method System.out.println("Scheme-specific part = " + uri.getSchemeSpecificPart()); // getRawUserInfo() method System.out.println("Raw User Info = " + uri.getRawUserInfo()); // getUserInfo() method System.out.println("User Info = " + uri.getUserInfo()); // getAuthority() method System.out.println("Authority = " + uri.getAuthority()); // getRawAuthority() method System.out.println("Raw Authority = " + uri.getRawAuthority()); } }
输出 :
Base URI = https://www.geeksforgeeks.org/ Relative URI = languages/../java Resolved URI = https://www.geeksforgeeks.org/java Relativized URI = java https://www.google.co.in/?gws_rd=ssl#q=networking+in+ java+geeksforgeeks&spf=1496918039682 Scheme = https Raw Scheme = //www.google.co.in/?gws_rd=ssl Scheme-specific part = //www.google.co.in/?gws_rd=ssl Raw User Info = null User Info = null Authority = www.google.co.in Raw Authority = www.google.co.in
- getHost() :返回 URI 的主机组件。由于 URI 的主机组件不能包含转义的八位字节,因此此方法不执行任何解码。
Syntax : public String getHost()
- getPort() :返回此 URI 的端口号。
Syntax : public int getPort()
- getRawPath() :返回此 URI 的原始路径,如果未定义,则返回 null。
Syntax : public String getRawPath()
- getPath() :返回此 URI 的解码路径组件。
Syntax : public String getPath()
- getRawQuery() :返回 URI 的查询组件,如果未定义,则返回 null。
Syntax : public String getRawQuery()
- getQuery() :以解码形式返回 URI 的查询组件,如果未定义,则返回 null。
Syntax : public String getQuery()
- getRawFragment() :返回 URI 的片段组件,如果未定义,则返回 null。
Syntax : public String getRawFragment()
- getFragment() :返回此 URI 的解码片段组件,如果未定义,则返回 null。
Syntax : public String getFragment()
- compareTo() :将此 URI 对象与另一个 URI 对象进行比较。通过使用 String.compareTo() 方法根据自然顺序执行比较。如果一个组件未定义而另一个组件已定义,则认为第一个小于第二个。要解析的组件以原始形式而不是编码形式进行比较。
Syntax : public int compareTo(URI uri) Parameters : uri : URI to be compared with
- equals() :使用此 URI 测试给定对象。 Ig 对象不是 URI,它返回 false。要使两个 URI 被视为相等,要求两者都是不透明的或都是分层的。在检查不同组件的相等性时,会考虑它们的原始形式而不是编码形式。
Syntax : public boolean equals(Object ob) Parameters : ob : object to be compared for equality
- isAbsolute() :如果此 URI 是绝对的,则返回 true,否则返回 false。当且仅当它具有方案组件时,URI 才是绝对的。
Syntax : public boolean isAbsolute()
- isOpaque() :如果此 URI 不透明,则返回 true,否则返回 false。当且仅当 URI 是绝对的并且其特定于方案的部分不以斜杠字符('/') 开头时,URI 才是不透明的
Syntax : public boolean isOpaque()
- hashCode() :返回此 URI 对象的哈希码。在为 URI 对象创建哈希码时会考虑所有组件。
Syntax : public int hashCode()
- toString() :返回此 URI 对象的字符串表示形式。
Syntax : public String toString()
- toASCIIString() :以 ASCII 格式返回字符串表示形式。
Syntax : public String toASCIIString()
Java实现:
//Java Program to illustrate various //URI class methods import java.net.*; class uridemo1 { public static void main(String[] args) throws Exception { String str = "https://www.google.co.in/?gws_rd=ssl#"+"" + "q=networking+in+java+geeksforgeeks"+"" +"&spf=1496918039682"; // Constructor to create a new URI // by parsing the given string. URI uri = new URI(str); // getHost() method System.out.println("Host = " + uri.getHost()); // getPort() method System.out.println("Port = " + uri.getPath()); // getRawPath() method System.out.println("Raw Path = " + uri.getRawPath()); // getPath() method System.out.println("Path = " + uri.getPath()); // getQuery() method System.out.println("Query = " + uri.getQuery()); // getRawQuery() method System.out.println("Raw Query = " + uri.getRawQuery()); // getFragment() method System.out.println("Fragment = " + uri.getFragment()); // getRawFragment() method System.out.println("Raw Fragment = " + uri.getRawFragment()); URI uri2 = new URI(str + "fr"); // compareTo() mrthod System.out.println("CompareTo =" + uri.compareTo(uri2)); // equals() method System.out.println("Equals = " + uri.equals(uri2)); // hashcode() method System.out.println("Hashcode : " + uri.hashCode()); // toString() method System.out.println("toString : " + uri.toString()); // toASCIIString() method System.out.println("toASCIIString : " + uri.toASCIIString()); } }
输出 :
Host = www.google.co.in Port = / Raw Path = / Path = / Query = gws_rd=ssl Raw Query = gws_rd=ssl Fragment = q=networking+in+java+geeksforgeeks&spf=1496918039682 Raw Fragment = q=networking+in+java+geeksforgeeks&spf=1496918039682 CompareTo =-2 Equals = false Hashcode : 480379574 toString : https://www.google.co.in/?gws_rd=ssl#q=networking+ in+java+geeksforgeeks&spf=1496918039682 toASCIIString : https://www.google.co.in/?gws_rd=ssl#q= networking+in+java+geeksforgeeks&spf=1496918039682
参考:
官方Java文档