模块  java.base
软件包  java.net

Class URL

  • 实现的所有接口
    Serializable

    public final class URLextends Objectimplements 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 Literal IPv6地址格式也支持scope_ids。 scope_ids的语法和用法描述于here

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

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

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

    应用程序还可以指定“相对URL”,其中仅包含足以相对于另一个URL到达资源的信息。 相对URL经常在HTML页面中使用。 例如,如果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的编码或解码形式之间的等效性。 例如,两个网址:

      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实现。 提供程序所在的顺序是特定于实现的,并且实现可以自由地缓存所定位的提供程序。 一个ServiceConfigurationErrorErrorRuntimeException从抛出createURLStreamHandler ,如果遇到,将传播到调用线程。 如果实例化,则使用协议字符串调用每个提供程序的createURLStreamHandler方法,直到提供程序返回非null,或者所有提供程序已用尽。
        3. 如果上一步未能找到协议处理程序,则构造函数将读取系统属性的值:
          java.protocol.handler.pkgs
          如果该系统属性的值不是null ,则将其解释为由垂直斜杠字符“ | ”分隔的包列表。 构造函数尝试加载名为的类:
          <package>.<protocol>.Handler
          其中<package>被包名称替换, <protocol>被协议名称替换。 如果此类不存在,或者该类存在但它不是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是根据给定的上下文URL和spec参数创建的,如RFC2396“统一资源标识符:通用*语法”中所述:
                  <scheme>://<authority><path>?<query>#<fragment> 
        引用被解析为方案,权限,路径,查询和片段部分。 如果路径组件为空并且未定义方案,权限和查询组件,则新URL是对当前文档的引用。 否则,规范中存在的片段和查询部分将用于新URL。

        如果方案组件是在给定规范中定义的,并且与上下文的方案不匹配,则新URL将仅基于规范创建为绝对URL。 否则,方案组件将继承自上下文URL。

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

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

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

        有关URL解析的更详细说明,请参阅RFC2396。

        参数
        context - 解析规范的上下文。
        spec - 要解析为URL的 String
        异常
        MalformedURLException - 如果未指定协议,或 spec未知协议,或者 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的查询部分。
        结果
        URLnull的查询部分(如果不存在)
        从以下版本开始:
        1.3
      • getPath

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

        public String getUserInfo()
        获取此 URL的userInfo部分。
        结果
        URL的userInfo部分,如果不存在, 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()相同,加上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​(<?>[] classes)                        throws IOException
        获取此URL的内容。 此方法是以下的简写:
             openConnection().getContent(classes) 
        参数
        classes - Java类型的数组
        结果
        此URL的内容对象是classes数组中指定的类型的第一个匹配项。 如果不支持所请求的类型,则返回null。
        异常
        IOException - 如果发生I / O异常。
        从以下版本开始:
        1.3
        另请参见:
        URLConnection.getContent(Class[])