📜  Java Java类

📅  最后修改于: 2022-05-13 01:54:28.901000             🧑  作者: Mango

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]
  1. scheme : scheme 组件列出了与 URI 关联的协议。在某些方案中,“//”是必需的,而另一些则不需要。
    abc://admin:admin@geeksforgeeks.org:1234/path/data
                 ?key=value&key2=value2#fragid1
  2. 权威:权威组件由几个组件组成-身份验证部分,主机和可选的端口号,前面带有':'。身份验证部分包括用户名和密码。主机可以是任何 IP 地址。
    abc://admin:admin@geeksforgeeks.org:1234/path/data
                 ?key=value&key2=value2#fragid1
  3. path :路径表示一个字符串,其中包含服务器内到资源的地址。
    abc://admin:admin@geeksforgeeks.org:1234/path/data
                 ?key=value&key2=value2#fragid1
  4. 查询:查询表示非分层数据,通常用于搜索特定资源的查询。它们用“?”隔开从前面的部分。
    abc://admin:admin@geeksforgeeks.org:1234/path/data
                 ?key=value&key2=value2#fragid1
  5. 片段:片段用于将辅助资源标识为页面中的标题或子标题等。
    abc://admin:admin@geeksforgeeks.org:1234/path/data
                 ?key=value&key2=value2#fragid1

构造函数:

  1. 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
  2. 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

    类似地,根据创建时已知的组件提供其他构造函数。

  3. 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 
    
  4. 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 
    
  5. 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
    

方法 :

  1. create() :创建一个新的 URI 对象。该方法可以称为伪构造函数。它被提供用于确定给定字符串将解析为 URI 对象并且如果它不解析将被视为程序员错误的情况。
    Syntax : public static URI create(String str)
    Parameters :
    str : String to be parsed as URI
  2. parseServerAuthority() :此方法用于解析 URI 的权限组件(如果提供给用户信息、主机和端口组件)。此方法返回一个 URI 对象,其权限字段已被解析为基于服务器的权限。
    Syntax : public URI parseServerAuthority()
  3. normalize() :规范化这个 URI 的路径。 URI 是通过规范化与 RFC 2396 一致的 URI 路径构造的。返回规范化的 URI 对象。
    Syntax : public URI normalize()
  4. 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
  5. relativize() :将给定的 URI 与此 URI 相对化。
    Syntax : public URI relativize(URI uri)

    参数 :
    uri : 相对化的 URI

  6. toURL() :从这个 URI 构造一个 URL。
    Syntax : public URL toURL()
              throws MalformedURLException
    Throws :
    MalformedURLException : If error occurs while constructing URL
  7. getScheme() :返回 URI 的方案组件
    Syntax : public String getScheme()
  8. getRawSchemeSpecificPart() :返回 URI 的原始方案特定组件。
    Syntax : public String getRawSchemeSpecificPart()
  9. getSchemeSpecificPart() :返回 URI 的解码方案特定组件
    Syntax : public String getSchemeSpecificPart()
  10. getRawAuthority() :返回 URI 的权限组件。如果权限是基于服务器的,则返回更多用户信息、主机和端口组件。
    Syntax : public String getRawAuthority()
  11. getAuthority() :返回与上述方法完全相同的结果,但解码形式除外。
    Syntax : public String getAuthority()
  12. getRawUserInfo() :返回 URI 的用户信息组件,如果未定义,则返回 null。
    Syntax : public String getRawUserInfo()
  13. 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
    
    
  14. getHost() :返回 URI 的主机组件。由于 URI 的主机组件不能包含转义的八位字节,因此此方法不执行任何解码。
    Syntax : public String getHost()
  15. getPort() :返回此 URI 的端口号。
    Syntax : public int getPort()
  16. getRawPath() :返回此 URI 的原始路径,如果未定义,则返回 null。
    Syntax : public String getRawPath()
  17. getPath() :返回此 URI 的解码路径组件。
    Syntax : public String getPath()
  18. getRawQuery() :返回 URI 的查询组件,如果未定义,则返回 null。
    Syntax : public String getRawQuery()
  19. getQuery() :以解码形式返回 URI 的查询组件,如果未定义,则返回 null。
    Syntax : public String getQuery()
  20. getRawFragment() :返回 URI 的片段组件,如果未定义,则返回 null。
    Syntax : public String getRawFragment()
  21. getFragment() :返回此 URI 的解码片段组件,如果未定义,则返回 null。
    Syntax : public String getFragment()
  22. compareTo() :将此 URI 对象与另一个 URI 对象进行比较。通过使用 String.compareTo() 方法根据自然顺序执行比较。如果一个组件未定义而另一个组件已定义,则认为第一个小于第二个。要解析的组件以原始形式而不是编码形式进行比较。
    Syntax : public int compareTo(URI uri)
    Parameters :
    uri : URI to be compared with
  23. equals() :使用此 URI 测试给定对象。 Ig 对象不是 URI,它返回 false。要使两个 URI 被视为相等,要求两者都是不透明的或都是分层的。在检查不同组件的相等性时,会考虑它们的原始形式而不是编码形式。
    Syntax : public boolean equals(Object ob)
    Parameters :
    ob : object to be compared for equality
  24. isAbsolute() :如果此 URI 是绝对的,则返回 true,否则返回 false。当且仅当它具有方案组件时,URI 才是绝对的。
    Syntax : public boolean isAbsolute()
  25. isOpaque() :如果此 URI 不透明,则返回 true,否则返回 false。当且仅当 URI 是绝对的并且其特定于方案的部分不以斜杠字符('/') 开头时,URI 才是不透明的
    Syntax : public boolean isOpaque()
  26. hashCode() :返回此 URI 对象的哈希码。在为 URI 对象创建哈希码时会考虑所有组件。
    Syntax : public int hashCode()
  27. toString() :返回此 URI 对象的字符串表示形式。
    Syntax : public String toString()
  28. 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文档