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个协议的资源获取
509

被折叠的 条评论
为什么被折叠?



