java网络学习之URL和URI的区别(2)

1 URL是一种特殊的URI

2  URI 语法结构说明: 

URI=[scheme:]<scheme-specific-part>[#fragment]   
这正好可以用URI类中的getScheme   getSchemeSpecificPart 以及getFragment得到.

在scheme为null时,这个URI被称为相对的URI。 在scheme不为空时URI称为绝对的URI

而<scheme-specfic-part>=[//authority]<path>[:query]

在path为空时称为不透明的URI,在不为空时称为透明的URI

authority 又可以分为:[userinfo@]<host>[:port]

从这个公式我们可以看到URI确实包括URL。

 

3 URL 语法说明

protocal:[//[user[:password]@]host[:port]][/path][?query][#fragment]

这里protocal 是指可以访问到其他服务器的协议。

 

4 代码示例

public class TestRegex {
    public static void main(String[] args)  throws Exception{

        URI uri=new URI("sss:sdfsf");
        System.out.println(uri.getScheme());

        URL url=new URL("sss:sdfsf");
        System.out.println(url.getProtocol());

    }
}

输出

sss
Exception in thread "main" java.net.MalformedURLException: unknown protocol: sss
    at java.net.URL.<init>(URL.java:593)
    at java.net.URL.<init>(URL.java:483)
    at java.net.URL.<init>(URL.java:432)
    at com.weiyan.risk.strategy.test.util.TestRegex.main(TestRegex.java:15)

 

可以看到 当协议是错误的时候URI 对象没有报错,而url 对象报错了,这证明一个问题

uri 是资源标识符,schema 可以是任意的,因为不一定要访问,只是标识而已 。

但是url 是资源定位符,protocal 必须是 特定的,因为需要访问到远程服务器或者本地方服务器,所以资源必须存在,并且通过已经实现的协议获取。

 

5 URI 类有一个方法toURL()

public class TestRegex {
    public static void main(String[] args)  throws Exception{

        URI uri=new URI("sss:sdfsf");
        System.out.println(uri.getScheme());
        uri.toURL();
    }
}

输出

sss
Exception in thread "main" java.net.MalformedURLException: unknown protocol: sss
    at java.net.URL.<init>(URL.java:593)
    at java.net.URL.<init>(URL.java:483)
    at java.net.URL.<init>(URL.java:432)
    at java.net.URI.toURL(URI.java:1089)
    at com.weiyan.risk.strategy.test.util.TestRegex.main(TestRegex.java:14)

可见 当协议不是指定已经实现的协议的时候,uri 转化为URL 也会失败。

因为 URL 在创建对象的时候会根据协议查找对应的协议处理器 如果找不到就抛出MalformedURLException

 

getURLStreamHandler(protocal)方法内部会通过 class.forName来加载 sun.net.www.protocol.<protocal>.Handler类

然后handler 调用parseUrl方法处理请求地址。

 

6 URL 支持哪些协议?

查看sun.net.www.protocol这个包发现

所以说 URL 只支持 file,ftp,http,https,jar,mailto,netdoc 7个协议的资源获取

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值