欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于JAVA中URI和URL的区别的理解

程序员文章站 2024-02-14 12:47:34
...

以下大部分来自JDK1.6的官方文档和源码,记述的是本人对于这两个类的理解。

根据JDK1.6的官方描述:

URI: 表示一个统一资源标识符 (URI) 引用。英文全称是UniformResource Identifiers。

一些URI的例子:

mailto:[email protected]

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();
        }
    }