URI(Uniform Resource Identifier)统一资源标识符,是采用一种特定语法标识一个资源的字符串。
URL(Uniform Resource Locator)统一资源定位符,URL可以标识一个资源在Internet上的位置。URL是最常见的URI。
URI的语法为:[模式:模式特定部分]
当前模式包括:
data 链接中直接包含的Base64编码数据
file 本地磁盘上的文件
ftp FTP服务器
http 使用超文本传输协议的国际互联网服务器
mailto 电子邮件地址
telnet 与基于Telnet的服务的连接
urn 统一资源名
URI中的模式特定部分没有特定的语法,不过,很多都采用层次结构形式,如:http://www.xxx.com/aa?query
模式部分由小写字母、数字和+. _ 组成。典型URI的其他三部分(授权机构、路径和查询)有ASCII字母数字组成,此外还可以使用- _ . ! ~。定界符包括(/ ? & =)。所有其他字符应当用%转义,如“木”的utf-8为E6 9C A8,它在URI中编码为%E6%9C%A8。
URL是一个URI,除了标识一个资源,还会为资源提供一个特定的网络位置。
URL的语法为:[protocol://userInfo@host:port/path?query#fragment]
protocol协议可以是file、ftp、http、https、magnet、telnet
host主机部分可以是主机名如www.xxx.com也可以是服务器IP地址xxx.xxx.xxx.xxx
userInfo部分是服务器的登录信息(可选)
port端口号(可选)默认80
userInfo@host:port构成权威机构
path路径指向服务器一个特定目录。
query查询字符串向服务器提供附加参数。
fragment片段指向远程资源的某个特定部分。
相对URL
在www.xxx.com/aaa/text页面点击将访问www.xxx.com/aaa/doc
如果相对链接以“/”开头,将访问www.xxx.com/doc。
URL url1 = new URL("http://www.xxx.com/aaa/text"); URL url2 = new URL(url1,"text"); URL url3 = new URL(url1,"/text"); System.out.println(url2+"\n"+url3);
输出:
http://www.xxx.com/aaa/text
http://www.xxx.com/text
统一资源标志符URI就是在某一规则下能把一个资源独一无二地标识出来。
举个例子:
比如我的身份证号码320XXXXX0001就是URI。
中国/东南大学/计算机楼/xxx/我的名字就是URL。
所以不论是用定位的方式还是用编号的方式,我们都可以唯一确定一个人,都是URI的一种实现,而URL就是用定位的方式实现的URI。
java.net.URL是final类。
常用方法(除了一些get方法):
public final InputStream openStream() throws java.io.IOException
打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream。这只是完全把网络上的资源当成二进制流来处理,编码方式的检测和声明是Web体系结构中比较棘手的问题之一。
public URLConnection openConnection() throws java.io.IOException public URLConnection openConnection(Proxy proxy)throws java.io.IOException
返回一个URLConnection 对象,它表示到 URL 所引用的远程对象的连接。通过URLConnection对象可以访问原始文档外还可以访问HTTP首部等信息。
public final Object getContent() throws java.io.IOException
下载URL引用数据的第三种方法。
URI toURI() 返回与此 URL 等效的 URI。
其他方法可以参照API。
同样是final类。URI是对URL的抽象,不仅包括URL还包括URN(Uniform Resource Names)。实际使用的URI大多是URL。
常用方法:
URI relativize(URI uri)
根据此 URI 将给定 URI 相对化。
URI resolve(String str)
解析给定的字符串,然后在此URI 的基础上构造一个新的 URI。
URI resolve(URI uri)
根据此 URI 解析给定的 URI。
String toASCIIString()
以 US-ASCII 字符串形式返回此 URI 的内容。
String toString()
以字符串形式返回此 URI 的内容。
URL toURL()
根据此 URI 构造一个 URL。
不知道这么长的名字是谁起的,意思就是在web中传输的非ASCII字符需要进行编码。
编码方式比较简单,除了ASCII数字、字母和- _ . ,其他字符都要转换为字节,每个字节要写成%两个十六进制数字。空格是一种特殊情况,除了编码为%20,空格可以编码为+。
String encoded = URLEncoder.encode("aaa bbb ccc 中国","UTF-8"); System.out.println(encoded);
输出:
aaa+bbb+ccc+%E4%B8%AD%E5%9B%BD
注意URLEncoder会进行盲目编码,比如/&=:等有时候在URL中是必须的,所以编码时需要部分处理。
String decoded = URLDecoder.decode("aaa+bbb+ccc+%E4%B8%AD%E5%9B%BD","UTF-8"); System.out.println(decoded);
输出:
aaa bbb ccc 中国