![Java核心技术·卷Ⅱ:高级特性(原书第10版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/937/34339937/b_34339937.jpg)
4.4.1 URL和URI
URL和URLConnection类封装了大量复杂的实现细节,这些细节涉及如何从远程站点获取信息。例如,可以自一个字符串构建一个URL对象:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/211-i.jpg?sign=1738863846-n5DhBpFplHGdCOIDpLik7Hf7GWqsVAjj-0-47d0c359f32f3a0eaa1743dd3ad12cfd)
如果只是想获得该资源的内容,可以使用URL类中的openStream方法。该方法将产生一个InputStream对象,然后就可以按照一般的用法来使用这个对象了,比如用它构建一个Scanner对象:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/211-2-i.jpg?sign=1738863846-JtmgvkejAzr9Zar90LwvistjxMuWRUNY-0-5453b4c225bc89debe9f889883193ca4)
java.net包对统一资源定位符(Uniform Resource Locator,URL)和统一资源标识符(Uniform Resource Identifier,URI)作了非常有用的区分。
URI是个纯粹的语法结构,包含用来指定Web资源的字符串的各种组成部分。URL是URI的一个特例,它包含了用于定位Web资源的足够信息。其他URI,比如
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/211-4-i.jpg?sign=1738863846-pgQujHwTsNUPcgXqJhZbyoX2MBHlR9OR-0-69938573dbac4fb84fdf800418cb52ba)
则不属于定位符,因为根据该标识符我们无法定位任何数据。像这样的URI我们称之为URN(uniform resource name,统一资源名称)。
在Java类库中,URI类并不包含任何用于访问资源的方法,它的唯一作用就是解析。但是,URL类可以打开一个到达资源的流。因此,URL类只能作用于那些Java类库知道该如何处理的模式,例如http:、https:、ftp:、本地文件系统(file:)和JAR文件(jar:)。
要想了解为什么对URI进行解析并非小事一桩,那么考虑一下URL会变得多么复杂。例如,
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/211-3-i.jpg?sign=1738863846-zE4a0yWK92QxtJwQfEdhUlia2JqrKO0Y-0-8a2c78d38d3d47e1c5dc61d771eee212)
URI规范给出了标记这些标识符的规则。一个URI具有以下句法:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/212-i.jpg?sign=1738863846-ur2bwOqklfG79SJFcOoyxSCp29KFHakn-0-243d987573aa8a3e6a03b155f7fe5a76)
上式中,[...]表示可选部分,并且:和#可以被包含在标识符内。
包含scheme:部分的URI称为绝对URI。否则,称为相对URI。
如果绝对URI的schemeSpecificPart不是以/开头的,我们就称它是不透明的。例如:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/212-2-i.jpg?sign=1738863846-EwhyJc1SzGhumjkPLwBckESYqDXu73WQ-0-852f09a554be31bb2470c8f571ff674a)
所有绝对的透明URI和所有相对URI都是分层的(hierarchical)。例如:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/212-3-i.jpg?sign=1738863846-LuhZKZc9I76crFa9tIBCykjwvu4KhbI4-0-93e646b1d8e1bb61887fe43d331afd01)
一个分层URI的schemeSpecificPart具有以下结构:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/212-4-i.jpg?sign=1738863846-DaEp7cL1U425MGKH58T7DHV4nHB1OzL3-0-08b3281d1f19e88e6b93092815d27832)
在这里,[...]同样表示可选的部分。
对于那些基于服务器的URI,authority部分具有以下形式:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/212-5-i.jpg?sign=1738863846-NcU11pqO1gloTcXM5HURTCorob47QN74-0-a3bac8a6e9e5c0c7af572794ca27eb85)
port必须是一个整数。
RFC 2396(标准化URI的文献)还支持一种基于注册表的机制,此时authority采用了一种不同的格式。不过,这种情况并不常见。
URI类的作用之一是解析标识符并将它分解成各种不同的组成部分。你可以用以下方法读取它们:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/212-6-i.jpg?sign=1738863846-8WzSpKhrFqlBCk14CTod7N5dVs69ZCpl-0-ffcd4ab0b747f650bf4b51fc7b0653ea)
URI类的另一个作用是处理绝对标识符和相对标识符。如果存在一个如下的绝对URI:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/212-7-i.jpg?sign=1738863846-yAvkjjxTwPCvN7xXoZ4M89hy2fZAzjyo-0-bf693c8151f6a7d51f81b1f83cebc0f4)
和一个如下的相对URI:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/212-8-i.jpg?sign=1738863846-4FkfxpkLDIirUez5QGiLcPeuJ05tlbyl-0-a4893dffe5bdb5a271bf3c3f15d77e24)
那么可以用它们组合出一个绝对URI:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/212-9-i.jpg?sign=1738863846-lqp6hn01xQ8nP154mRskUrBj9y7DYJ6H-0-99e5653f220501bfbbbe3f58fb1e1a98)
这个过程称为解析相对URL。
与此相反的过程称为相对化(relativization)。例如,假设有一个基本URI:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/213-i.jpg?sign=1738863846-Alz2Sj6qRI6gXcqU1wi2SCajmYkj5HxP-0-1349e8d34a415b0c1622f37e010b1492)
和另一个URI:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/213-2-i.jpg?sign=1738863846-ltEdt3nTKJcZGaMdnUIo4RtXyQuLl36x-0-d3fe4cee1ac67d08af169dc51c03f5c5)
那么相对化之后的URI就是:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/213-3-i.jpg?sign=1738863846-KU4ww6sAKXgp8YRXI9twpH0KnvxZkJY8-0-1c904176c6afaa74a1e9f09a9238d7b4)
URI类同时支持以下两个操作:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/213-4-i.jpg?sign=1738863846-aLSypoVCiF0SPD0ZfiNFYLvEjdx3HPxt-0-1e3afee757f927f2dec63569d695c5a2)