Android URI与URL的区别

首先,URI,是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源。而URL是uniform resource locator,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。而URN,uniform resource name,统一资源命名,是通过名字来标识资源,比如mailto:java-net@java.sun.com。也就是说,URI是以一种抽象的,高层次概念定义统一资源标识,而URL和URN则是具体的资源标识的方式。URL和URN都是一种URI。

  • 1.URL 比较实体   表示一个具体的
  • 2.URI 比较抽象 表示一个相对的意思
  • 3.Android中有一个Uri,位于android.net包下  显然是为android定制的
  • 4.所属包不同
    Url是 Java提供的一个类,位于java.net.URI
    Uri是Android 提供的一个类,位于android.net.Uri
    由此可见Uri是Url的扩展,来满足Android的需要
  • 5.作用不同:Uri是Android开发的,扩展了Java中URI的一些功能来特定的适用于Android开发,所以大家在开发时,只使用Android 提供的Uri即可;

URL – –   比如 http://www.baidu.com/124/123    是一个绝对的路径

URI – – 比如 /124/123 是一个相对的路径

Android Uri是一个android处理url的工具例如:

String url = "http://www.java2s.com:8080/yourpath/fileName.htm?stove=10&path=32&id=4#harvic";
Uri uri = Uri.parse(url);
LogUtils.e("域名"+uri.getHost());
LogUtils.e("端口号"+uri.getPort()); 

打印出:域名 www.java2s.com   端口号:8080

对于一个图片描述 imageUrl还是imageUri可以视具体而定   如果图片路径是完整路径建议用imageUrl更为贴切,相对路径用imageUri,当然如果是绝对路径用imageUri也没关系,因为imageUrl是imageUri的一种情况

Uri 结构

三种划分方式:

  • [scheme:]scheme-specific-part[#fragment]
  • [scheme:][//authority][path][?query][#fragment]
  • [scheme:][//host:port][path][?query][#fragment]

获取Uri元素

直接看代码、注释比较全,Uri各个部分都有对应的方法获取。为了方便直观的看到效果,可以对照着Log日志,总会找到你需要的。

private void button5() {
        String uri = "http://www.zpan.com:8080/lujing/path.htm?id=10&name=zhangsan&old=24#zuihoude";
        Uri mUri = Uri.parse(uri);

        // 协议
        String scheme = mUri.getScheme();
        // 域名+端口号+路径+参数
        String scheme_specific_part = mUri.getSchemeSpecificPart();
        // 域名+端口号
        String authority = mUri.getAuthority();
        // fragment
        String fragment = mUri.getFragment();
        // 域名
        String host = mUri.getHost();
        // 端口号
        int port = mUri.getPort();
        // 路径
        String path = mUri.getPath();
        // 参数
        String query = mUri.getQuery();

        Log.e("zpan", "======协议===scheme ==" + scheme);
        Log.e("zpan", "======域名+端口号+路径+参数==scheme_specific_part ===" + scheme_specific_part);
        Log.e("zpan", "======域名+端口号===authority ==" + authority);
        Log.e("zpan", "======fragment===fragment ==" + fragment);
        Log.e("zpan", "======域名===host ==" + host);
        Log.e("zpan", "======端口号===port ==" + port);
        Log.e("zpan", "======路径===path ==" + path);
        Log.e("zpan", "======参数===query ==" + query);

        // 依次提取出Path的各个部分的字符串,以字符串数组的形式输出
        List<String> pathSegments = mUri.getPathSegments();
        for (String str : pathSegments) {
            Log.e("zpan", "======路径拆分====path ==" + str);
        }
        // 获得所有参数 key
        Set<String> params = mUri.getQueryParameterNames();
        for(String param: params) {
            Log.e("zpan","=====params=====" + param);
        }

        // 根据参数的 key,取出相应的值
        String id = mUri.getQueryParameter("id");
        String name = mUri.getQueryParameter("name");
        String old = mUri.getQueryParameter("old");

        Log.e("zpan", "======参数===id ==" + id);
        Log.e("zpan", "======参数===name ==" + name);
        Log.e("zpan", "======参数===old ==" + old);
    }

Log

E/zpan: ======协议===scheme ==http
E/zpan: ======域名+端口号+路径+参数==scheme_specific_part ===//www.zpan.com:8080/lujing/path.htm?id=10&name=zhangsan&old=24
E/zpan: ======域名+端口号===authority ==www.zpan.com:8080
E/zpan: ======fragment===fragment ==zuihoude
E/zpan: ======域名===host ==www.zpan.com
E/zpan: ======端口号===port ==8080
E/zpan: ======路径===path ==/lujing/path.htm
E/zpan: ======参数===query ==id=10&name=zhangsan&old=24
/////////////////////////////路径//////////////////////////////
E/zpan: ======路径拆分====path ==lujing
E/zpan: ======路径拆分====path ==path.htm
/////////////////////////////参数//////////////////////////////
E/zpan: =====params=====id
E/zpan: =====params=====name
E/zpan: =====params=====old
E/zpan: ======参数===id ==10
E/zpan: ======参数===name ==zhangsan
E/zpan: ======参数===old ==24

参考地址1

参考地址2

0

留下评论