作者:鲍先强
涉及到网络编程时,很容易混淆的两个概念就是URL和URI,本文将会通过一个简单的程序,比较一下两者的区别,主要内容包括:
1,URL。
2, 相对URI和绝对URI 。
3,不透明的URI。
4.一个演示两者区别的程序。
1. URL: 通用资源定位器(Universal Resource Locator),按照RFC2396标准,URL对象用来定位网络里的资源,URL所支持的协议有http,https,file,ftp,jar,应用程序可以通过URL.setURLStreamHandlerFactory (URLStreamHandlerFactory)来让应用程序支持其他的协议,还可以通过系统属性java.protocol.handler.pkgs设置,以让URL支持其他的协议,下面是对一个URL所包含的内容的解释。
------------------------解释---------------------------------------------------
URL:http://username:password@host:port/file?query#ref
对上面这个URL它的组成部分包括下面这些部分,
Authority是:username:password@host:port
Host是:IP/域名
Port是:站点,没有返回-1
Path是:robot.txt,相对于File而言Path里面不包含查询字符串
Query是:查询字符串
Ref是:参考,又要Fragment
Scheme是:Protocol
------------------------例子---------------------------------------------------
URL:http://developer.android.com/referencejava/net/URL.html?s=a#getRef()
那么它的各个属性的值就为:
Authority是:developer.android.com
Host是:developer.android.com
Port是:-1
File是/referencejava/net/URL.html?s=a
Path是/referencejava/net/URL.html
Query是:s=a
Ref是:getRef()
2. URI: java.net.URI和android.net.URI完全相同, URI要么是绝对的要么是相对的,绝对的URI有模式(Scheme),如果它的模式是URL所支持的,你可以使用toURL()方法, 将它转化为URL对象。你可以用一个绝对的URI将一个相对的URI给绝对话,使用absolute.resolve(relative)返回结果就是被绝对化的URI。同时我们也可以利用一个绝对的URI将另外一个绝对的URI给相对化,absolute.relativize(resolved)返回结果就是resolved相对于这个绝对的URI的相对URI.具体的使用方法,以及两者之间的区别,请看下面的程序。
3. 不透明URI: URI通常情况下都是层次的,但是也有不透明的,层次的URI包含模式,主机,站点等各个部分,当然可能某些部分不包含,但是不透明的URI只包含三个部分,Scheme,Scheme-specific-part,Fragment. 如:mailto:[email protected]
4. 下面是这个使用URL和URI的例子程序,运行结果在后面贴出。
package net;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
public class URIandURL {
public static void main(String args[]){
try {
URL url=new URL("http://developer.android.com/referencejava/net/URL.html?s=a#getRef()");
System.out.println("Authority是:"+url.getAuthority());
System.out.println("Host是:"+url.getHost());
System.out.println("Port是:"+url.getPort());
System.out.println("File是"+url.getFile());
System.out.println("Path是"+url.getPath());
System.out.println("Query是:"+url.getQuery());
System.out.println("Ref是:"+url.getRef());
} catch (MalformedURLException e) {
e.printStackTrace();
}
try {
URI absolute=new URI("http://www.baidu.com");
URI relative=new URI("robot.txt");
URI resolved=new URI("http://www.baidu.com/robot.txt");
System.out.println("-----------------------解析前-------------------------");
System.out.println("Authority是:"+relative.getAuthority());
System.out.println("Host是:"+relative.getHost());
System.out.println("Port是:"+relative.getPort());
System.out.println("Path是"+relative.getPath());
System.out.println("Query是:"+relative.getQuery());
System.out.println("Ref是:"+relative.getFragment());
System.out.println("Scheme是:"+relative.getScheme());
System.out.println("-----------------------解析后-------------------------");
relative=absolute.resolve(relative);
System.out.println("Authority是:"+relative.getAuthority());
System.out.println("Host是:"+relative.getHost());
System.out.println("Port是:"+relative.getPort());
System.out.println("Path是"+relative.getPath());
System.out.println("Query是:"+relative.getQuery());
System.out.println("Ref是:"+relative.getFragment());
System.out.println("Scheme是:"+relative.getScheme());
System.out.println("-----------------------相对化-------------------------");
relative=absolute.relativize(resolved);
System.out.println("Authority是:"+relative.getAuthority());
System.out.println("Host是:"+relative.getHost());
System.out.println("Port是:"+relative.getPort());
System.out.println("Path是"+relative.getPath());
System.out.println("Query是:"+relative.getQuery());
System.out.println("Ref是:"+relative.getFragment());
System.out.println("Scheme是:"+relative.getScheme());
System.out.println("-----------------------不透明-------------------------");
URI uri=new URI("mailto:warsh@msncn");
System.out.println("Authority是:"+uri.getAuthority());
System.out.println("Host是:"+uri.getHost());
System.out.println("Port是:"+uri.getPort());
System.out.println("Path是"+uri.getPath());
System.out.println("Query是:"+uri.getQuery());
System.out.println("Ref是:"+uri.getFragment());
System.out.println("Scheme是:"+uri.getScheme());
System.out.println("Scheme具体部分:"+uri.getSchemeSpecificPart());
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/*-----------------------解析前-------------------------
Authority是:null
Host是:null
Port是:-1
Path是robot.txt
Query是:null
Ref是:null
Scheme是:null
-----------------------解析后-------------------------
Authority是:www.baidu.com
Host是:www.baidu.com
Port是:-1
Path是robot.txt
Query是:null
Ref是:null
Scheme是:http
-----------------------相对化-------------------------
Authority是:null
Host是:null
Port是:-1
Path是robot.txt
Query是:null
Ref是:null
Scheme是:null
------------------------解释---------------------------
Authority是:username:password@host:port
Host是:IP/域名
Port是:站点,没有返回-1
Path是:robot.txt,相对于File而言Path里面不包含查询字符串
Query是:查询字符串
Ref是:参考,又要Fragment
Scheme是:Protocol
*/