Module  java.base
软件包  java.net

Class URL

  • All Implemented Interfaces:
    Serializable


    public final class URL
    extends Object
    implements Serializable
    URL代表统一资源定位器,指向万维网上“资源”的指针。 资源可以像文件或目录一样简单,或者可以是对更复杂的对象的引用,例如对数据库或搜索引擎的查询。 有关URL类型及其格式的更多信息,请参见: Types of URL

    一般来说,URL可以分为几个部分。 请考虑以下示例:

         http://www.example.com/docs/resource1.html
     

    上面的URL表示要使用的协议是http (超文本传输协议),并且信息驻留在名为www.example.com的主机上。 该主机上的信息名为/docs/resource1.html 主机上此名称的确切含义取决于协议和主机。 信息通常驻留在一个文件中,但它可以在飞行中生成。 该URL的这个组件称为路径组件。

    URL可以选择指定一个“端口”,它是在远程主机上进行TCP连接的端口号。 如果未指定端口,则使用协议的默认端口。 例如, http的默认端口为80 另一个端口可以指定为:

         http://www.example.com:1080/docs/resource1.html
     

    的语法URL由下式定义RFC 2396: Uniform Resource Identifiers (URI): Generic Syntax ,通过修正RFC 2732: Format for Literal IPv6 Addresses in URLs 文字IPv6地址格式也支持scope_ids。 scope_ids的语法和用法描述为here

    URL可能附加了一个“片段”,也称为“ref”或“reference”。 片段由尖锐的符号字符“#”表示,后跟更多的字符。 例如,

         http://java.sun.com/index.html#chapter1
     

    该片段在技术上不是URL的一部分。 相反,它表示在检索到指定的资源之后,应用程序对chapter1附加有标签chapter1的文档的该部分特别感兴趣。 标签的含义是资源特定的。

    一个应用程序还可以指定一个“相对URL”,它只包含相对于另一个URL访问资源的足够的信息。 HTML页面中经常使用相对URL。 例如,如果URL的内容:

         http://java.sun.com/index.html
     
    在其中包含相对URL:
         FAQ.html
     
    这将是一个速记:
         http://java.sun.com/FAQ.html
     

    相对URL不需要指定URL的所有组件。 如果协议,主机名或端口号丢失,该值将从完全指定的URL继承。 必须指定文件组件。 可选片段不被继承。

    URL类本身不会根据RFC2396中定义的转义机制对任何URL组件进行编码或解码。 来电者有责任编码任何需要在调用URL之前进行转义的字段,并对从URL返回的任何转义字段进行解码。 此外,由于URL不具有URL转义的知识,因此不能识别同一URL的编码或解码形式之间的等同性。 例如,两个URL:

      http://foo.com/hello world/ and http://foo.com/hello%20world 
    将被视为不相等。

    请注意, URI类在某些情况下确实执行其组件字段的转义。 管理URL编码和解码的推荐方法是使用URI ,并使用toURI()URI.toURL()在这两个类之间进行转换。

    也可以使用URLEncoderURLDecoder类,但仅适用于HTML格式编码,这与RFC2396中定义的编码方案不同。

    从以下版本开始:
    1.0
    另请参见:
    Serialized Form
    • 构造方法详细信息

      • URL

        public URL​(String protocol,
                   String host,
                   int port,
                   String file)
            throws MalformedURLException
        创建URL从指定对象protocolhostport号码,和file

        host可以表示为主机名或字面IP地址。 如果使用IPv6文字地址,则应包含在方括号( '['']' )中,如RFC 2732所述 ; 但是, RFC 2373: IP Version 6 Addressing Architecture定义的文字IPv6地址格式也被接受。

        指定port-1表明URL应使用的默认端口的协议。

        如果这是使用指定协议创建的第一个URL对象,则会为该协议创建一个流协议处理程序对象,一个类别为URLStreamHandler的实例:

        1. 如果应用程序先前设置了一个URLStreamHandlerFactory作为流处理程序工厂的实例,那么该实例的createURLStreamHandler方法将以协议字符串作为参数来调用,以创建流协议处理程序。
        2. 如果尚未设置URLStreamHandlerFactory ,或者如果工厂的createURLStreamHandler方法返回null ,则使用ServiceLoader机制来使用系统类加载器来定位URLStreamHandlerProvider实现。 提供者所在的顺序是具体的实现,并且实现可以自由缓存定位的提供者。 一个ServiceConfigurationErrorError或者RuntimeException从抛出createURLStreamHandler ,如果遇到,将传播到调用线程。 每个提供者的createURLStreamHandler方法(如果已实例化)都使用协议字符串进行调用,直到提供程序返回非空,或者所有提供程序都已用尽。
        3. 如果上一步无法找到协议处理程序,构造函数将读取系统属性的值:
          java.protocol.handler.pkgs
          如果该系统属性的值不是null ,它将被解释为由一个垂直斜杠字符' | '分隔的包的列表。 构造函数尝试加载名为
          <package>.<protocol>.Handler
          其中<package>被替换为包的名称,而<protocol>被替换为协议的名称。 如果此类不存在,或者类存在但不是URLStreamHandler的子类, URLStreamHandler尝试列表中的下一个包。
        4. 如果上一步无法找到协议处理程序,则构造函数尝试加载内置的协议处理程序。 如果此类不存在,或者类存在但不是URLStreamHandler的子类,则抛出一个MalformedURLException

        以下协议的协议处理程序保证存在于搜索路径上:

             http, https, file, and jar
         
        还可以提供附加协议的协议处理程序。 一些协议处理程序,例如用于加载平台类或类路径上的类的协议处理程序可能不会被覆盖。 这些限制的细节以及这些限制(例如在运行时的初始化期间)是具体的,因此没有指定

        这个构造函数不会对输入进行验证。

        参数
        protocol - 要使用的协议的名称。
        host - 主机的名称。
        port - 主机上的端口号。
        file - 主机上的文件
        异常
        MalformedURLException - 如果未知协议或端口为-1以外的负数
        另请参见:
        System.getProperty(java.lang.String)setURLStreamHandlerFactory( java.net.URLStreamHandlerFactory)URLStreamHandlerURLStreamHandlerFactory.createURLStreamHandler( java.lang.String)
      • URL

        public URL​(String spec)
            throws MalformedURLException
        String表示形成一个URL对象。

        这个构造函数相当于使用一个null第一个参数调用双参数构造函数。

        参数
        spec - 要解析为URL的 String
        异常
        MalformedURLException - 如果未指定协议或未找到协议,或者 specnull ,或者解析的URL不符合相关协议的具体语法。
        另请参见:
        URL(java.net.URL, java.lang.String)
      • URL

        public URL​(URL context,
                   String spec)
            throws MalformedURLException
        通过在指定的上下文中解析给定的规范来创建一个URL。 新URL是根据RFC2396“统一资源标识符:通用*语法”中描述的给定上下文URL和规范参数创建的:
                  <scheme>://<authority><path>?<query>#<fragment>
         
        引用被解析为方案,权限,路径,查询和片段部分。 如果路径组件为空,并且方案,权限和查询组件未定义,则新URL是对当前文档的引用。 否则,规范中存在的片段和查询部分将用于新的URL。

        如果方案组件在给定规范中定义,并且与上下文方案不匹配,则根据规范单独创建新URL作为绝对URL。 否则,方案组件从上下文URL继承。

        如果权限组件存在于规范中,则规范被视为绝对的,规范权限和路径将替换上下文权限和路径。 如果规范中缺少权限组件,则新URL的权限将从上下文继承。

        如果规范的路径组件以斜杠字符“/”开头,那么该路径将被视为绝对路径,并且规范路径将替换上下文路径。

        否则,将路径视为相对路径,并附加到上下文路径,如RFC2396中所述。 此外,在这种情况下,通过删除由“..”和“。”发生的目录更改来规范路径。

        有关URL解析的更详细的描述,请参阅RFC2396。

        参数
        context - 解析规范的上下文。
        spec - 要解析为URL的 String
        异常
        MalformedURLException - 如果未指定协议或未找到协议,或者 specnull ,或者解析的URL不符合相关协议的具体语法。
        另请参见:
        URL(java.lang.String, java.lang.String, int, java.lang.String)URLStreamHandlerURLStreamHandler.parseURL(java.net.URL, java.lang.String, int, int)
    • 方法详细信息

      • getQuery

        public String getQuery​()
        获取此 URL的查询部分。
        结果
        查询这个 URL部分,或者是 null如果不存在的话
        从以下版本开始:
        1.3
      • getPath

        public String getPath​()
        获取此 URL的路径部分。
        结果
        这个 URL的路径部分,或一个空字符串(如果不存在)
        从以下版本开始:
        1.3
      • getUserInfo

        public String getUserInfo​()
        获取这个 URL的userInfo部分。
        结果
        该用户信息部分为 URL ,或 null如果不存在
        从以下版本开始:
        1.3
      • getAuthority

        public String getAuthority​()
        获得这个 URL的权限部分。
        结果
        该权限部分为 URL
        从以下版本开始:
        1.3
      • getPort

        public int getPort​()
        获取此 URL的端口号。
        结果
        端口号,如果端口未设置,则为-1
      • getDefaultPort

        public int getDefaultPort​()
        获取与此URL关联的协议的默认端口号。 如果URL方案或URL的URLStreamHandler未定义默认端口号,则返回-1。
        结果
        端口号
        从以下版本开始:
        1.4
      • getProtocol

        public String getProtocol​()
        获取此协议名称 URL
        结果
        该协议 URL
      • getHost

        public String getHost​()
        获取此URL的主机名(如适用)。 主机的格式符合RFC 2732,即对于一个文字的IPv6地址,该方法将返回包含在方括号( '['']' )中的IPv6地址。
        结果
        该主机名称为 URL
      • getFile

        public String getFile​()
        获取此URL的文件名。 返回的文件部分将与getPath()相同,加上值为getQuery()的连接(如果有)。 如果没有查询部分,此方法和getPath()将返回相同的结果。
        结果
        该文件名为 URL ,如果不存在,则为空字符串
      • getRef

        public String getRef​()
        获得这个 URL的锚点(也称为“参考”)。
        结果
        URL的锚点(也称为“参考”)或 null如果不存在
      • equals

        public boolean equals​(Object obj)
        将此URL与其他对象进行比较。

        如果给定的对象不是一个URL,那么这个方法将立即返回false

        如果两个URL对象具有相同的协议,引用等效主机,主机上具有相同的端口号,以及该文件的相同文件和片段,则它们是相等的。

        如果两个主机名都可以解析成相同的IP地址,则两台主机被认为是等效的; 否则如果任一主机名无法解析,主机名必须相等而不考虑大小写; 或两个主机名等于null。

        由于主机比较需要名称解析,因此此操作是阻塞操作。

        注意:已知与equals的定义行为与HTTP中的虚拟主机不一致。

        重写:
        equalsObject
        参数
        obj - 要比较的URL。
        结果
        true如果对象是一样的; false否则。
        另请参见:
        Object.hashCode()HashMap
      • sameFile

        public boolean sameFile​(URL other)
        比较两个URL,不包括片段组件。

        如果这个URLother参数是相等的,而不考虑片段组件,则返回true

        参数
        other - 与 URL进行比较。
        结果
        true如果他们引用同一个远程对象; false否则。
      • toURI

        public URI toURI​()
                  throws URISyntaxException
        返回相当于此URL的URI 该方法的功能与new URI (this.toString())相同。

        请注意,符合RFC 2396的任何URL实例都可以转换为URI。 但是,一些不严格遵守的URL不能转换为URI。

        结果
        与此URL相当的URI实例。
        异常
        URISyntaxException - 如果此URL严格按照RFC2396进行格式化,不能转换为URI。
        从以下版本开始:
        1.5
      • getContent

        public final Object getContent​()
                                throws IOException
        获取此URL的内容。 这个方法是一个简写:
             openConnection().getContent()
         
        结果
        这个URL的内容。
        异常
        IOException - 如果发生I / O异常。
        另请参见:
        URLConnection.getContent()
      • getContent

        public final Object getContent​(Class<?>[] classes)
                                throws IOException
        获取此URL的内容。 这个方法是一个简写:
             openConnection().getContent(classes)
         
        参数
        classes - 一个Java类型的数组
        结果
        该URL的内容对象是类数组中指定的类型的第一个匹配项。 如果不支持请求的类型,则为null。
        异常
        IOException - 如果发生I / O异常。
        从以下版本开始:
        1.3
        另请参见:
        URLConnection.getContent(Class[])