这期继续网络方面的话题。
学习android,肯定都会知道统一资源标示符URI。其实我对这个中文字面十分不敏感,因为无法形成一个具体抽象的事物,所以,常常URI URL傻傻分不清楚。因为URL的中文是统一资源指示符,啊不对,统一资源...那个,你自己baidu吧。
其实,还是英语最好区分,URI = uniform resource identifier,最后一个词,id嘛(姑且这么
理解,差不多,呵呵)。 URL = uniform resource locator。
URI是一个纯粹的句法结构,用于指定标识Web资源的字符串的各个不同部分。URL是URI的一个特例,它包含了用于定位Web资源的足够信息。所以,URL是URI的一个特例,比如这个mailto:cay@horstmann.com,不知道怎么叫吧,他叫URN(name)也是URI的一种。
在java和android中,URI对外的
接口是不太一样的,在android中URI的
意义非常重大,他是所有资源的标示符(ID),通过URI可找到一个一一对应的具体实体,如文件(file),数据库的表项(content)等,可以说贯穿这个
Framework。
这么重要,我们就先来看看URI一般的格式:
[scheme:]schemeSpecificPart[#fragment] ([...]表示可选)
首先,我查看了下java.net下的URI,它有两个方法isAbsolute()和isOpaque()。
好,先看第一个方法,是否绝对的?
URI分为两大类,
绝对URI和
相对URI。
分类方法为:有scheme:开头的就是绝对URI,否则就是绝对URI。(如 file:///sdcard/xxx和../../java/net/Socket.html#Socket())
第二个方法,是否透明?
定义,绝对URI中,schemeSpecificPart不是以/开头,这个URI就是
不透明的,如:mailto:cay@horstmann.com
(可以从上面得出树状结构
URI:绝对和相对 绝对:透明和不透明)
还有个比较重要的概念,绝对的透明的URI和相对的URI都是
分层的(hierarchical)
去看看android的URI api吧,所有is判断都会有。
有了上述概念,看看android中URI的具体类有:OpaqueUri,HierarchicalUri和StringUri。怎么样,能看懂了吧。
我们继续,如果一个URI是分层的,那么这个URI的schemeSpecificPart(一般简称ssp)是如下结构:
[authority][path][?query] ([...]表示可选)
而对于那些基于服务器的URI来说,authority结构为:
[userinfo@]host[:port]
以上部分是必须记住的,否则你就无法理解一个URI的这正意义。
然后,使用中,URI类的作用之一就是
解析标示符并将它们分解成各个组成部分。记住并了解下面的方法吧:
getScheme() getSchemeSpecificPart() getAuthority() getUserInfo() getHost() getPort() getPath() getQuery() getFragment() (其实是有顺序的,你能看出来吗)
好了,所有URI的概念就介绍完了,但对于URI类,另一个作用就是处理绝对URI和相对URI。
如果存在如下的绝对URI:
http://docs.mycompany.com/api/java/net/ServerSocket.html
和一个如下相对URI:
../../java/net/Socket.html#Socket()
那么可以将它们合并成一个绝对URI:
http://docs.mycompany.com/api/java/net/Socket.html#Socket()
这个过程被称为相对URL的
转换(resolving)。
与此相反的过程称之为
相对化(relativization)。
如,有一个基本URI:
http://docs.mycompany.com/api
和另一个URI:
http://docs.mycompany.com/api/java/lang/String.html
那么相对化之后的URI就是:
http://docs.mycompany.com/api (没错,是一个相对URI)
对应api就是:
relative = base.relativize(combined);
combined = base.resolve(relative);
好了,看完此文,你会
发现URI的所有接口你都能看懂了!
Cheers~