android URL 和 URI编程

作者:鲍先强

涉及到网络编程时,很容易混淆的两个概念就是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

*/


你可能感兴趣的:(android URL 和 URI编程)