URL类
URL可以唯一地标识一个资源在 Internet 上的位置。
URL类是 Java 程序在网络上定位和获取数据的最简单的方法。URL除了标识一个资源,还会为资源提供一个特定的网络位置,客户端可以用来获取这个资源的一个表示。而URI,只能告诉你一个资源是什么,但是无法告诉你它在那里,以及如何得到这个资源。
URL语法
URL语法为:protocol://userInfo@host:port/path?query#fragment
- 协议部分:file,ftp,http,https,magnet,telnet
- 用户信息:服务器登录信息
- 用户信息,主机,端口在一起构成权威机构
- 查询字符串向服务器提供附加参数。一般只在http URL中使用,包含表单数据,作为输入提供给在这个服务器上运行的程序。
- 片段:指向远程资源的某个特定部分。片段标识符目标在HTML文档中用Id属性创建。
相对URL
继承了父文档的部分信息,这些不完整的URL称为相对URL。相反,完整指定的URL称为绝对URL。
如果相对链接以“/”开头,那么它相当于文档根目录,而不是相对于当前文件。
如浏览 http://www.aaa.com/test/1.text
点击下面的连接
<a href="/new/2.text">
浏览器会去掉/test/1.text,将/new/2.text附加到 http://www.aaa.com后面
相对URL允许用多种协议来提供一个文档树。最重要的是,相对URL允许将整个文档树从一个网站移动或复制到另一个网站,而不会破坏所有的内部链接。
URL类的特点
java.net.URL 类是对统一资源定位符的抽象。是一个final类,不能对其派生子类。
URL类不采用继承来配置不同类型的URL实例,而是采用策略设计模式,协议处理器是策略,URL类构成上下文,通过它来选择不同的策略。
URL是不可变的,因此它们是线程安全的。
URL类的API
创建新的URL
URL(String url) throws MalformedURLException
URL(String protocol,String hostname,String file)
URL(String protocol,String host,int port,String file)
URL(URL base,String relative)
注意:除了验证能否识别URL模式外,Java不会对它构造的URL完成任何正确性检查。
从URL中获取数据
InputStream openStream() throws IOException
URLConnection openConnection() 如果希望与服务器直接通信,使用这个方法
URLConnection openConnection(Proxy proxy)
Object getContent()
Object getContent(Classp[ ] classes)
分解URL
URL由模式(协议),授权机构,路径,片段标识符,查询字符串组成。可通过如下方法获取:
getFile(),getHost(),getPort(),getProtocol(),getRef(),getQuery(),getPath(),getUserInfo(),getAuthority()
相等性比较
当且仅当两个URL都指向相同的主机,端口和路径上的相同资源,且有相同片段标识符和查询字符串,才认为两个URL是相等的。但是equals()方法会尝试使用DNS解析主机,判断主机是否相同。
警告:URL上的equals()可能是一个阻塞的I/O操作,应避免将URL存储在依赖equals()的数据结构中,如hashMap。更好的选择是URI,必要时将URI和URL来回转换。
转换
toString(),toExternalForm() 两者基本相同
toURI() 将URL对象转换为URI对象
对于绝对化和编码操作,把URL存储在一个散列表或其他数据结构中,应当首选URI类。URL类主要用于从服务器下载内容。
URI类
统一资源标识符采用特定语法标识一个资源的字符串。资源是由URI标识的内容,URI是标识一个资源的字符串。
URI语法
URI的语法由一个模式和一个模式特定组成部分组成,用冒号分隔。如
模式:模式特定部分
模式包括:data,file,ftp,http,mailto,magnet,telnet,urn
模式特定部分无特定语法,很多采用层次结构形式如:
//authority/path?query
经典URI三部分分别由 ASCII 字母数字符号组成。所有其他字符,包括非 ASCII 字母数字,应当用百分号 % 转义,其后是该字符按UTF-8 编码的十六进制码。若没有将非ASCII字符编码为十六进制码,而是将它们直接包含在URI中,那得到的是IRI。
URI和URL的区别
URI是对URL的抽象。java.net.URI与java.net.URL类的区别:
- URI类完全有关于资源的标识和URI的解析,没有提供方法来获取URI所标识资源的表示
- 相比URL类,URI类与相关的规范更一致
- URI对象可以表示相对URI,URL类在存储URI之前会将其绝对化
一句话,URL对象是对应网络获取的应用层协议的一个表示,而URI对象纯粹用于解析和处理字符串。