最后一个组件是fragment尽管该组件作为URI的一部分出现但不是绝对的当使用URI进行某种检索操作时后面执行操作的软件使用fragment聚焦于软件感兴趣的资源部分(在该软件成功检索到资源的数据后)
为了实际表现前面提到的组件信息可以使用下面的URI
ftp://:/public/notes?text=shakespeare#hamlet
上面的URI把ftp识别为大纲把:识别为基于服务器的授权机构(其中george是用户信息是主机是端口)把/public/notes识别为路径把text=shakespeare识别为查询把hamlet识别为片断
本质上它是一个叫做george的用户希望通过/public/notes路径在服务器的端口上检索shakespeare文本的hamlet信息在shakespeare成功的返回到该程序后程序定位hamlet段并把它呈献给该用户
标准化可以通过目录术语来理解假定目录x直接位于根目录之下x有子目录a和bb有文件memotxta是当前目录为了显示memotxt中的内容(在微软Windows下)你可能输入type \x\\b\memotxt
你也可能输入type \x\a\\b\memotxt在这种情况下a和的出现是没有必要的这两种形式都不是最简单的但是如果输入\x\b\memotxt你就指定了最简单的路径了从根目录开始访问memotxt最简单的\x\b\memotxt路径就是标准化的路径
通常通过基本的和相对的URI访问资源基本的URI是绝对的URI它唯一地标识了某种资源的名字空间而相对的URI标识了与基础的URI相对的资源(与基本的URI不同相对的URI在某种资源的生存周期内可以永远不需要改变)因为基本的和相对的URI都不能完整的识别某种资源有必要把两种URI通过解析过程合并相反地通过相对化从合并的URI中提取相对的URI也是可行的
注意
不透明的URI与其它的URI不同它不服从标准化分解和相对化
假定你把x://a/作为基础的URI并把b/c作为相对的URI根据基础URI分解这个相对的URI将产生x://a/b/c根据x://a/相对化x://a/b/c将产生b/c
URI不能定位或读取/写入资源这是统一的资源定位器(URL)的任务URL是一种URI但是它的大纲组件是已知的网络协议(简称协议)并且它把URI组件与某种协议处理程序(一种资源定位器和根据协议建立的约束规则与资源通讯的读/写机制)
URI一般不能为资源提供持久不便的名称这是统一的资源命名(URN)的任务URN也是一种URI但是全球唯一的持久不便的即使资源不在存在或不再使用
使用URI
网络API通过提供了URI类(位于程序包中)使我们在源代码层使用URI成为可能URI的构造函数建立了封装URI的URI对象URI的方法建立URI对象
如果授权机构组件是基于服务器的就分析它提取URI组件决定URI对象的URI是绝对的还是相对的决定URI对象的URI是不透明的还是分层的
比较两个URI对象中的URI标准化(normalize)URI对象的URI根据URI对象的基础URI分解某个相对的URI以得到已分解的URI根据URI对象的基础URI关联某个已分解的URI以得到相对的URI把URI对象转换为URL对象
我们进一步查看URI类在它里面有五个构造函数最简单的是URI(String uri)这个构造函数把URI作为String类型的参数把URI分解为组件并把这些组件存储在一个新的URI对象中
如果String对象的URI(通过uri引用)违反了RFC 的语法规则其它的四个构造函数URI(String uri)将会产生一个URISyntaxException对象
下面的代码片断演示了使用URI(String uri)建立封装了一个简单的URI组件的URI对象
URI uri = new URI ();