![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=1739361769-JnExcWNejGkxVksvSybhLZcsVS5p4p5x-0-fe182cbb96d64a8e34cacabd6a820142)
如果只是想获得该资源的内容,可以使用URL类中的openStream方法。该方法将产生一个InputStream对象,然后就可以按照一般的用法来使用这个对象了,比如用它构建一个Scanner对象:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/211-2-i.jpg?sign=1739361769-HZEGeYfECQvpARcgaY8JHaxmzsioBzgG-0-9388c83a4c97d032dd7278fc876c3605)
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=1739361769-Rcrt9CZa2A6dJpEuljODfelwsfyTEMC8-0-6d6852e6b43beaa8baa54c5fa9fed7aa)
则不属于定位符,因为根据该标识符我们无法定位任何数据。像这样的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=1739361769-JDIe6p7srIQdB9gzqx82MK5YXSAT5FzS-0-e3e10867e92d9718392a8041e31f4a9c)
URI规范给出了标记这些标识符的规则。一个URI具有以下句法:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/212-i.jpg?sign=1739361769-5wiHbxOnP9GusvwMxz1Udcrr3nobHpCJ-0-5894bf2c7d07bac54dddd468f71dba29)
上式中,[...]表示可选部分,并且:和#可以被包含在标识符内。
包含scheme:部分的URI称为绝对URI。否则,称为相对URI。
如果绝对URI的schemeSpecificPart不是以/开头的,我们就称它是不透明的。例如:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/212-2-i.jpg?sign=1739361769-zNFcjoFUaS80Hv2eJJgi6k2xccJfCQCf-0-5509f4845159e1c88b073ccb7225d31c)
所有绝对的透明URI和所有相对URI都是分层的(hierarchical)。例如:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/212-3-i.jpg?sign=1739361769-etugZcvqvVmQiyPNW6p8NlGp9CCs07w8-0-cd19dc4523cb0af5f6046b7f3900e7f2)
一个分层URI的schemeSpecificPart具有以下结构:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/212-4-i.jpg?sign=1739361769-BG7qd9N4uCykAbY14CofR0LCkMR0L55z-0-8af94fae3778a724e02a8cc8b2cb5941)
在这里,[...]同样表示可选的部分。
对于那些基于服务器的URI,authority部分具有以下形式:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/212-5-i.jpg?sign=1739361769-PBHiWJ8p8Ye9gWoU89KqXeyYe7S7dy2t-0-16dedeac7bafa6a3fe8669779ae92009)
port必须是一个整数。
RFC 2396(标准化URI的文献)还支持一种基于注册表的机制,此时authority采用了一种不同的格式。不过,这种情况并不常见。
URI类的作用之一是解析标识符并将它分解成各种不同的组成部分。你可以用以下方法读取它们:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/212-6-i.jpg?sign=1739361769-ktvdJJ6KIFh7ondAdBCRCVCG31nmmZm0-0-5c64f1a70b32bab9d89c653e75f3f072)
URI类的另一个作用是处理绝对标识符和相对标识符。如果存在一个如下的绝对URI:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/212-7-i.jpg?sign=1739361769-qTS5MPnjkaK3soAzyIX0zezMwxB1vOza-0-6b1ca7ddfaacd77200bd093ba0a9da42)
和一个如下的相对URI:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/212-8-i.jpg?sign=1739361769-7yvseYm9JX8LikP4cD93c29JxtMEDCfh-0-750c4e1f4ce07626d8e6d7b65349c05b)
那么可以用它们组合出一个绝对URI:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/212-9-i.jpg?sign=1739361769-4YijauIxmyMEih4hkRLJ2VEs6bhjQQWt-0-6019812ecb125de2174eefb8355ab4b1)
这个过程称为解析相对URL。
与此相反的过程称为相对化(relativization)。例如,假设有一个基本URI:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/213-i.jpg?sign=1739361769-Br2hEPbpFbfFh374shNAEIxyMdinwlmR-0-7d7790799042cbc4c168048cd3bce0fd)
和另一个URI:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/213-2-i.jpg?sign=1739361769-Bp0pJ2rL50XTNC8n3o4rKLSdJ4FPZrjI-0-096a4f2ad4f259c1d905c892897ec87a)
那么相对化之后的URI就是:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/213-3-i.jpg?sign=1739361769-PWvgdKHbj26tI4Ud5Elf0i9bzrnx4Dxy-0-c2a45d3e7419aaf34d569c8a4f115ec0)
URI类同时支持以下两个操作:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/213-4-i.jpg?sign=1739361769-2dl7K77gLKsaUaAAzCOARcTzmYj1aaDa-0-f9058905fd26bb607c63c2b19f4f524d)