以下大部分来自JDK1.6的官方文档和源码,记述的是本人对于这两个类的理解。
根据JDK1.6的官方描述:
URI: 表示一个统一资源标识符 (URI) 引用。英文全称是UniformResource Identifiers。
一些URI的例子:
mailto:java-net@java.sun.com
news:comp.lang.java
urn:isbn:096139210x
http://java.sun.com/j2se/1.3/
docs/guide/collections/designfaq.html#28
../../../demo/jfc/SwingSet2/src/SwingSet2.java
file:///~/calendar
URL:代表一个统一资源定位符,它是指向一个互联网“资源”的指针。互联网是关键,URL指向的资源都是网络资源,所以它需要指定一个具体的协议。
一些URL的例子:
http://java.sun.com/index.html#chapter1
http://www.socs.uts.edu.au:80/MosaicDocs-old/url-primer.html
ftp://www.xx.com/1.txt
首先从标准的角度看,URL是URI的一个子集。
其次从编程角度看:
URI提供一个toURL()方法将URI转化成一个URL,如果转换不成功会抛出MalformedURLException或者在执行过程中可能会抛出:IllegalArgumentException
URI实现了Serializable和Comparable接口,由此看来URI是可以被序列化的,并且需要提供Comparable接口的compareTo方法。
一个URI有九个组成部分
参数名称 | 中文意思 | 类型 |
scheme | 方案 | String |
fragment | 片段 | String |
authority | 授权 | String |
userInfo | 用户信息 | String |
host | 主机 | String |
port | 端口 | Int |
path | 路径 | String |
query | 查询 | String |
schemeSpecificPart | 特定于方案的部分 | String |
需要注意的是,上面的九个成员变量都是transient类型,意味着,序列化的时候,这些值是不会被序列化的。整个对象中唯一可以被序列化的就是
private volatile String string;
这个string是根据上面的成员按照URI的规则生成的一个字符串。
创建一个URI除了使用构造函数,还可以使用URI提供的静态方法
URI.create(String s);它可以根据给定的字符串,按照URI的规则进行解析从而得到一个URI实例。
URL在URI的基础之上,又增加了一些字段。
URI类在某些特定的情况下,会对其组成的字段执行转义。建议使用URI管理URL的编码和解码,并使用URI.toURL()和URL.toURI()进行转换。
URL可以通过OpenConnection()获得一个URLConnection对象,而URLConnection可以通过connection()等方法对网络资源进行操作。
所以,如果按照官方给出的提示,我们按照以下的方式读取一个网络资源:
public static void main(String[] args){
URI uri = URI.create("http://www.baidu.com") ;
URLConnection urlConnection = null;
try {
urlConnection = uri.toURL().openConnection();
} catch (IOException e) {
e.printStackTrace();
}
try {
InputStream inputStream =urlConnection.getInputStream() ;
InputStreamReader isr = new InputStreamReader(inputStream) ;
char[] c = new char[1024] ;
while (isr.read(c)!=-1){
System.out.print(c) ;
}
} catch (IOException e) {
e.printStackTrace();
}
}