URI、URL

Author Avatar
罗炜光 4月 19, 2016
  • 在其它设备中阅读本文章

概述

URI(uniform resource identifier)统一资源标识符
URL(uniform resource locator)统一资源定位器

URL是URI的一种,不仅标识了Web 资源,还指定了操作或者获取方式,同时指出了主要访问机制和网络位置

●在Java类库中,URI类不包含任何访问资源的方法,它唯一的作用就是解析。相反的是,URL类可以打开一个到达资源的流。因此URL类只能作用于那些 Java类库知道该如何处理的模式,例如http:,https:,ftp:,本地文件系统(file:),和Jar文件(jar:)。

●URI一般由三部组成
①访问资源的命名机制
②存放资源的主机名
③资源自身的名称,由路径表示,着重强调于资源。

●URL是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上,特别是著名的Mosaic。
采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。
URL一般由三部组成
①协议(或称为服务方式)
②存有该资源的主机IP地址(有时也包括端口号)
③主机资源的具体地址。如目录和文件名等

结构

URI的结构:
[Scheme:][SchemeSpecificPart][#fragment]
||
[Scheme:][//Authority][path][?query][#fragment]
||
[scheme:][//userinfo@][host][:port][path][?query][#fragment]

URL的结构
[Protocol:][//Authority][File][#Ref]
||
[Protocol:][//userinfo@][host][:port][?query][#Ref]

例子

URI

public class Test
{
    public static void main(String[] args) throws URISyntaxException, MalformedURLException
    {
        String str = "http://Test%E4%B8%AD%E6%96%87@user.qzone.qq.com:8080/123456/Test%E4%B8%AD%E6%96%87?ptsig=%E4%B8%AD%E6%96%87Test/oR#122345";

        URI uri1 = new URI(str);
        URI uri2 = new URI("http","//www.baidu.com:8080/123?asd=123", "123");
        URI uri3 = new URI("http", "www.baidu.com", "/123", "123");
        URI uri4 = new URI("http", "www.baidu.com", "/123","asd=123", "123");
        URI uri5 = new URI("http", "Test%E4%B8%AD%E6%96%87",  "www.baidu.com",  8080,"/123","asd=123", "123");
        URI uri6 = new URI("http://www.baidu.com");
        URI uri7 = new URI("x/../123/../456?asd=123");
        URI uri8 = new URI("mailto:java-net@java.sun.com");
        System.out.println(uri1);
        System.out.println(uri2);
        System.out.println(uri3);
        System.out.println(uri4);
        System.out.println(uri5);
        //compareTo(URI that) int 将此 URI 与另一个对象(也必须是 URI)进行比较。
        System.out.println("compareTo(URI that):" + uri4.compareTo(uri5));
        //create(String str) static URI 通过解析给定的字符串创建 URI。
        System.out.println("create(String str):" + URI.create(str));
        //equals(Object ob) boolean 测试此 URI 与另一对象的相等性。
        System.out.println("equals(Object ob):" + uri1.equals(URI.create(str)));
        //getAuthority() String 返回此 URI 的已解码的授权组成部分。
        System.out.println("getAuthority():" + uri1.getAuthority());
        //getFragment() String  返回此 URI 的已解码的片段组成部分。
        System.out.println("getFragment():" + uri1.getFragment());
        //getHost() String  返回此 URI 的主机组成部分。
        System.out.println("getHost():" + uri1.getHost());
        //getPath() String  返回此 URI 的已解码的路径组成部分。
        System.out.println("getPath():" + uri1.getPath());
        //getPort() int 返回此 URI 的端口号。
        System.out.println("getPort():" + uri1.getPort());
        //getQuery() String 返回此 URI 的已解码的查询组成部分。
        System.out.println("getQuery():" + uri1.getQuery());
        //getRawAuthority() String 返回此 URI 的原始授权组成部分。
        System.out.println("getRawAuthority():" + uri1.getRawAuthority());
        //getRawFragment() String 返回此 URI 的原始片段组成部分。
        System.out.println("getRawFragment():" + uri1.getRawFragment());
        //getRawPath() String 返回此 URI 的原始路径组成部分。
        System.out.println("getRawPath():" + uri1.getRawPath());
        //getRawQuery() String 返回此 URI 的原始查询组成部分。
        System.out.println("getRawQuery():" + uri1.getRawQuery());
        //getRawSchemeSpecificPart() String 返回此 URI 原始的、特定于方案的部分。
        System.out.println("getRawSchemeSpecificPart():" + uri1.getRawSchemeSpecificPart());
        //getRawUserInfo() String 返回此 URI 的原始用户信息组成部分。
        System.out.println("getRawUserInfo():" + uri1.getRawUserInfo());
        //getScheme() String 返回此 URI 的方案组成部分。
        System.out.println("getScheme():" + uri1.getScheme());
        //getSchemeSpecificPart() String 返回此 URI 的特定于方案的解码部分。
        System.out.println("getSchemeSpecificPart():" + uri1.getSchemeSpecificPart());
        //getUserInfo() String  返回此 URI 的已解码的用户信息组成部分。
        System.out.println("getUserInfo():" + uri1.getUserInfo());
        //hashCode() int  返回此 URI 的哈希码值。
        System.out.println("hashCode():" + uri1.hashCode());
        //isAbsolute() boolean  判断此 URI 是否为绝对的。
        System.out.println("isAbsolute():" + uri1.isAbsolute());
        //isOpaque() boolean 判断此 URI 是否为不透明的。
        System.out.println("isOpaque():" + uri8.isOpaque());
        //normalize()  URI 规范化此 URI 的路径。
        System.out.println("normalize():" + uri7.normalize());
        //parseServerAuthority()  URI 尝试将此 URI 的授权组成部分(如果已定义)解析为用户信息、主机和端口组成部分。
        System.out.println("parseServerAuthority():" + uri1.parseServerAuthority());
        //relativize(URI uri)  URI 根据此 URI 将给定 URI 相对化。 即把传入去除的URI路径去掉相同的部分
        System.out.println("relativize(URI uri):" + uri3.relativize(uri4));
        //resolve(String str)  URI 解析给定的字符串,然后在此 URI 的基础上构造一个新的 URI。
        System.out.println("resolve(String str):" + uri6.resolve("/123"));
        //resolve(URI uri)   URI 根据此 URI 解析给定的 URI。
        System.out.println("resolve(URI uri):" + uri4.resolve(uri3));
        //toASCIIString()  String 以 US-ASCII 字符串形式返回此 URI 的内容。
        System.out.println("toASCIIString():" + uri1.toASCIIString());
        //toString()  String 以字符串形式返回此 URI 的内容。
        System.out.println("toString():" + uri1.toString());
        //toURL()  URL 根据此 URI 构造一个 URL。
        System.out.println("toURL():" + uri1.toURL());

    }
}

结果

http://Test%E4%B8%AD%E6%96%87@user.qzone.qq.com:8080/123456/Test%E4%B8%AD%E6%96%87?ptsig=%E4%B8%AD%E6%96%87Test/oR#122345
http://www.baidu.com:8080/123?asd=123#123
http://www.baidu.com/123#123
http://www.baidu.com/123?asd=123#123
http://Test%25E4%25B8%25AD%25E6%2596%2587@www.baidu.com:8080/123?asd=123#123
compareTo(URI that):-1
create(String str):http://Test%E4%B8%AD%E6%96%87@user.qzone.qq.com:8080/123456/Test%E4%B8%AD%E6%96%87?ptsig=%E4%B8%AD%E6%96%87Test/oR#122345
equals(Object ob):true
getAuthority():Test中文@user.qzone.qq.com:8080
getFragment():122345
getHost():user.qzone.qq.com
getPath():/123456/Test中文
getPort():8080
getQuery():ptsig=中文Test/oR
getRawAuthority():Test%E4%B8%AD%E6%96%87@user.qzone.qq.com:8080
getRawFragment():122345
getRawPath():/123456/Test%E4%B8%AD%E6%96%87
getRawQuery():ptsig=%E4%B8%AD%E6%96%87Test/oR
getRawSchemeSpecificPart()://Test%E4%B8%AD%E6%96%87@user.qzone.qq.com:8080/123456/Test%E4%B8%AD%E6%96%87?ptsig=%E4%B8%AD%E6%96%87Test/oR
getRawUserInfo():Test%E4%B8%AD%E6%96%87
getScheme():http
getSchemeSpecificPart()://Test中文@user.qzone.qq.com:8080/123456/Test中文?ptsig=中文Test/oR
getUserInfo():Test中文
hashCode():1143769884
isAbsolute():true
isOpaque():true
normalize():456?asd=123
parseServerAuthority():http://Test%E4%B8%AD%E6%96%87@user.qzone.qq.com:8080/123456/Test%E4%B8%AD%E6%96%87?ptsig=%E4%B8%AD%E6%96%87Test/oR#122345
relativize(URI uri):?asd=123#123
resolve(String str):http://www.baidu.com/123
resolve(URI uri):http://www.baidu.com/123#123
toASCIIString():http://Test%E4%B8%AD%E6%96%87@user.qzone.qq.com:8080/123456/Test%E4%B8%AD%E6%96%87?ptsig=%E4%B8%AD%E6%96%87Test/oR#122345
toString():http://Test%E4%B8%AD%E6%96%87@user.qzone.qq.com:8080/123456/Test%E4%B8%AD%E6%96%87?ptsig=%E4%B8%AD%E6%96%87Test/oR#122345
toURL():http://Test%E4%B8%AD%E6%96%87@user.qzone.qq.com:8080/123456/Test%E4%B8%AD%E6%96%87?ptsig=%E4%B8%AD%E6%96%87Test/oR#122345

URL

public class Test
{
    public static void main(String[] args) throws IOException, URISyntaxException
    {
        //根据 String 表示形式创建 URL 对象。
        URL url1 = new URL("https://hao.360.cn:80/?src=360c");
        //根据指定的 protocol 名称、host 名称和 file 名称创建 URL。
        URL url2 = new URL("http", "wwww.baidu.com", "/123?asd=123#123");
        //根据指定 protocol、host、port 号和 file 创建 URL 对象。
        URL url3 = new URL("http", "www.baidu.com", 80, "baidu?&ie=utf-8&word=");
        //根据指定的 protocol、host、port 号、file 和 handler 创建 URL 对象。
        URL url4 = new URL("http", "wwww.baidu.com", 80, "baidu?&ie=utf-8&word=123",null );
        //使用基地址和相对URL创建。
        URL url5 = new URL(url2, "/123");
        URL url6 = new URL(url2, "/123", null);
        URL url7 = new URL("http://www.weather.com.cn/data/cityinfo/101010100.html");

        //equals(Object obj) boolean 比较此 URL 是否等于另一个对象。
        System.out.println("equals(Object obj):" + url5.equals(url6));
        //getAuthority() String  获取此 URL 的授权部分。
        System.out.println("getAuthority():" + url1.getAuthority());
        //getContent() Object 获取此 URL 的内容。
        InputStream in = (InputStream) url7.getContent();
        System.out.println("getContent():" + inputStream2String(in));
        //getDefaultPort() int 获取与此 URL关联协议的默认端口号。
        System.out.println("getDefaultPort():" + url2.getDefaultPort());
        //getFile() String 获取此 URL的文件名。
        System.out.println("getFile():" + url2.getFile());
        //getHost() String 获取此 URL的主机名(如果适用)。
        System.out.println("getHost():" + url2.getHost());
        //getPath() String  获取此 URL 的路径部分。
        System.out.println("getPath():" + url2.getPath());
        //getPort() int 获取此 URL的端口号。
        System.out.println("getPort():" + url2.getPort());
        //getProtocol() String 获取此 URL的协议名称。
        System.out.println("getProtocol():" + url2.getProtocol());
        //getQuery() String  获取此 URL的查询部分。
        System.out.println("getQuery():" + url2.getQuery());
        //getRef() String 获取此 URL 的锚点(也称为“引用”)。
        System.out.println("getRef():" + url2.getRef());
        //getUserInfo() String 获取此 URL 的 userInfo 部分。
        System.out.println("getUserInfo():" + url2.getUserInfo());
        //hashCode() int 创建一个适合哈希表索引的整数。
        System.out.println("hashCode():" + url1.hashCode());
        //openConnection()  URLConnection 返回一个 URLConnection 对象,它表示到 URL 所引用的远程对象的连接。
        System.out.println("openConnection():" + url1.openConnection());
        //openConnection(Proxy proxy)  URLConnection 与 openConnection() 类似,所不同是连接通过指定的代理建立;不支持代理方式的协议处理程序将忽略该代理参数并建立正常的连接。
        System.out.println("openConnection(Proxy proxy):" + url1.openConnection(Proxy.NO_PROXY));
        //openStream()  InputStream 打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream。
        InputStream in2 =  url7.openStream();
        System.out.println("openStream():" + inputStream2String(in2));
        //sameFile(URL other) boolean 比较两个 URL,不包括片段部分。
        System.out.println("sameFile(URL other):" + url3.sameFile(url4));
        //toExternalForm() String 构造此 URL 的字符串表示形式。
        System.out.println("toExternalForm():" + url1.toExternalForm());
        //toString() String 构造此 URL的字符串表示形式。
        System.out.println("toString():" + url1.toString());
        //toURI() URI 返回与此 URL 等效的 URI
        System.out.println("toURI():" + url1.toURI());

    }

    static String inputStream2String(InputStream is) throws IOException{
        BufferedReader in = new BufferedReader(new InputStreamReader(is));
        StringBuffer buffer = new StringBuffer();
        String line = "";
        while ((line = in.readLine()) != null){
            buffer.append(line);
        }
        return buffer.toString();
    }
}

结果

equals(Object obj):true
getAuthority():hao.360.cn:80
getContent():{"weatherinfo":{"city":"北京","cityid":"101010100","temp1":"-2℃","temp2":"16℃","weather":"晴","img1":"n0.gif","img2":"d0.gif","ptime":"18:00"}}
getDefaultPort():80
getFile():/123?asd=123
getHost():wwww.baidu.com
getPath():/123
getPort():-1
getProtocol():http
getQuery():asd=123
getRef():123
getUserInfo():null
hashCode():-1412650423
openConnection():sun.net.www.protocol.https.DelegateHttpsURLConnection:https://hao.360.cn:80/?src=360c
openConnection(Proxy proxy):sun.net.www.protocol.https.DelegateHttpsURLConnection:https://hao.360.cn:80/?src=360c
openStream():{"weatherinfo":{"city":"北京","cityid":"101010100","temp1":"-2℃","temp2":"16℃","weather":"晴","img1":"n0.gif","img2":"d0.gif","ptime":"18:00"}}
sameFile(URL other):false
toExternalForm():https://hao.360.cn:80/?src=360c
toString():https://hao.360.cn:80/?src=360c
toURI():https://hao.360.cn:80/?src=360c

参考资料

URI和URL有什么区别