URL和URLConnection类封装了大量的复杂的实现细节,这些细节涉及到怎样从远程站点获取信息。
例如:我们可以通过传递一个字符串来构建一个URL对象
URL url = new URL("urlString");
如果只是想要从该资源获取内容,可以用URL类提供的openStream方法。返回一个InputStream对象。
然后按照一般的方法进行获取,比如:
InputStream inStream = url.openStream();
Scanner in = new Scanner(inStream);
java.net包对统一资源定位符(uniform resource locator,URL)和统一资源标识符(uniform resource identifier,URI)
作了非常有用的区分。
URI是个纯粹的句法结构,用于指定标识web资源的字符串的各个不同部分。URL是URI的一个特例,它包含了用于定位
web资源的足够信息。其它URI,如: mailto:****@163.com 则不属于定位符,因为根据该标识符我们无法定位任何数据。
像这样的URI我们称为URN(uniform resource name ,统一资源名称)。
java的类库中,URI类不包含任何用于访问资源的方法,它的唯一作用就是解析。相反的是URL类可以打开一个到达资源的
流。因此,URL类只能作用于java类库知道该如何处理的模式,如:http:。https:.tfp:本地文件系统(file:)和jar文件(jar:)。为了
解对URI进行解析并不是可有可无的,要考虑它也许会变得非常复杂。如:
http://maps.yahoo.com/py/maps.py?csz=Cupertino+CA
ftp://username:[email protected]/pub/file.txt
URI规范出了标记这些标识符的规则。一个URI具有以下句法:
[scheme:]schemeSpecificPart[#fragment]
上面的式子中[...]表示可行部分,它与:和#可以被包含在标识符内。它包含scheme:部分的URI被称为绝对URI。否则,被称为相对URI。
如果绝对的透明URI的schemeSpecificPart不是以/开头的,我们就称它不是透明的。例如:
mailto:***@163.com 所以绝对的透明URI和所有相对URI都是分层的(hierarchical)。例如:
http://ipc.me.index.html
../../java/net/socket.html#Socket()
一个分层的URI的schemeSpecificPart具有以下的结构:[//authority][path][?query] 在这里,[....]同样表示可选。
对于那些基于服务器的URI,authority部分采用以下的形式:[user-info@]host[:port] port表示服务器中的端口必须是一个整数。
URI的作用之一是:解析标识符并将它分解成各种不同的组成部分。可用以下的方法读取各个部分:
getScheme getSchemeSpecificPart getAuthority getUserInfo getHost
getPort getPath getQuery getFragment
URI的另一个作用是:处理绝对标识符和相对标识符。如果存在一个如下的绝对URI:
http://docs.mycompany.com/api/java/net/ServerSocket.html
和一个如下的相对URI:
../../java/net/Socket.html#Socket()
那么可以把它们合并成一个绝对的URI:
http://doc.mycompany.com/api/java/net/Socket.html#Socket()
这个过程被 称为相对URL的转换。(resolving)
与此相反的过程被称为“相对化”。例如,有一个基本的URI:
http://docs.mycompany.com/api 和另一个URI:
http://doc.mycompany.com/api/java/lang/String.html 那么它们相对化之后的URI就是
java/lang/Stirng.htlml
URI类同时支持以下两个操作:
relative = base.relativize(combined);
combined = base.resolve(relative);