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

以下大部分来自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();
        }
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值