首先,先来说一下什么是URI,URI是英文Uniform Resource Identifier即统一资源识别符,简单的说它的作用就是用来识别或者标识资源名称用的一串字符串。

我们先来看一个字符串:

http://localhost:8080/user/info?age=20&name=someone

做过web的童鞋都知道这是什么,这是一串在简单不过的连接了。好!下面我们就从这个链接入手来解释URI或者Uri,其实这两个是一个东西,只不过前者是java.net包下的,后者是android.net包下的只不过在原有基础上还拓展了一些东西。具体至于什么原因写安卓的同学都懂的。

我们先从java.net.URI入手:

URI uri=URI.create("http://localhost:8080/user/info?age=20&name=someone");

System.out.println(uri.getScheme());

System.out.println(uri.getSchemeSpecificPart());

System.out.println(uri.getAuthority());

System.out.println(uri.getHost());

System.out.println(uri.getPort());

System.out.println(uri.getPath());

System.out.println(uri.getQuery());

输出如下:

http

//localhost:8080/user/info?age=20&name=someone

localhost:8080

localhost

8080

/user/info

age=20&name=someone

看分别把这串字符串中的内容提取了出来。虽然看到方法名大概能知道获取的都是什么标识,但我们还是先把标准的URI定义出来吧!

URI的基本形式:

[scheme:]scheme-specific-part[#fragment]

(中括号里的是可以省略的)

从案例中对照中我们可以很清楚的看清关系对应,好像少了一个fragment,这个其实你就想象一下在上面的那串字符串后面在挂一个#xxx即可。

我们重点关注一下scheme-specific-part,中文翻译为方案具体内容,

我们现在进一步细分一下这个基本形式的URI

**[scheme:][//authority][/path][?query][#fragment] **

query参数可以带有对应的值,也可以不带,如果带对应的值用=表示,如:sheme://authority/path1/path2/path3?id = 1#fragment,这里有一个参数id,它的值是1,如果不带值那么他的值将会之null

query参数可以有多个,每个用&连接

scheme://authority/path1/path2/path3?id=1&name=mingming&old#fragment

这里有三个参数:参数1:id,其值是:1参数2:name,其值是:mingming参数3:old,没有对它赋值,所以它的值是null

在android中,除了scheme、authority是必须要有的,其它的几个path、query、fragment,它们每一个可以选择性的要或不要,但顺序不能变.

比如:

其中"path"可不要:scheme://authority?query#fragment

其中"path"和"query"可都不要:scheme://authority#fragment

其中"query"和"fragment"可都不要:scheme://authority/path

其中"path","query","fragment"都不要:scheme://authority

还剩下一个authority,这个authority其实包含了两个部分

1.host:主机名

2.port:端口号

因此最终的URI标准格式如下:

**[scheme:][//host:port][path][?query][#fragment] **

所以现在清楚了上面案例中输出的组成了吧。其实URI这个类就是帮你封装了这些部分,我们之前使用的是URI中的静态方法,将一个标准格式的字符串,转换成了URI对象。我们也可以使用URI uri=new URI("http://localhost:8080/user/info?age=20&name=someone");这种形式来创建一个URI对象,当然URI类也提供了我们其他的构造函数用来建立一个崭新的URI对象。其构造函数中的参数也是按照标准的顺序挨个传递相关参数。

例如上面的案例我们可以这么创建:

URI uri=new URI("http",null,"localhost",8080,"/user/info","age=20&name=someone",null);

System.out.println(uri.getScheme());

System.out.println(uri.getSchemeSpecificPart());

System.out.println(uri.getAuthority());

System.out.println(uri.getHost());

System.out.println(uri.getPort());

System.out.println(uri.getPath());

System.out.println(uri.getQuery());

第二个参数是userInfo,也是加载URI里面的但是是在Authority之前,在Scheme之后的用@分开,这里我们不关注它,直接写为null即可,其他的参数依次类推,最终我们将得到一样的效果。还有其他几个构造函数,大家可以自己去实践一下。

android中的Uri又多了几个更好用的方法:

getPathSegments()、getQueryParameter(String key)

List< String> getPathSegments()

此方法可以将path部分的内容按照"/"分割并转成List集合,例如例子中path是/user/info,使用此方法就会把user和info提取出来放入集合中方便我们使用。

getQueryParameter(String key)

此方法用来获取Query部分的值的,我们之前的getQuery获取到的是一个整体age=20&name=someone,而这个方法会传入一个key拿到相应的值,如String age=getQueryParameter("age")获取到的就是值就是20,如果值不存在 则会是null。

结论:通过此对象我们可以轻松定义一个项目中自己的协议来相互间传递信息。

java uri_Android中的Uri与Java中的URI类相关推荐

  1. Java 中的 XML:Java 文档模型的用法

    Java 中的 XML:Java 文档模型的用法 英文原文 内容: 代码对比 DOM JDOM dom4j Electric XML XPP 结束语 下一次... 参考资料 关于作者 对本文的评价 相 ...

  2. jsp 将页面中的值导入java中_JavaWeb - JSP:概述和语法,内置对象,JavaBean 组件,MVC 设计模式

    JSP 的概述 概念 JSP 是 Java Server Pages 的简称,跟 Servlet 一样可以动态生成 HTML 响应, JSP 文件命名为 xxx.jsp. 与 Servlet 不同,J ...

  3. java 拦截所有路径_Java或Web中解决所有路径问题

    Java中使用的路径,分为两种:绝对路径和相对路径.归根结底,Java本质上只能使用绝对路径来寻找资源.所有的相对路径寻找资源的方法,都不过是一些便利方法.不过是API在底层帮助我们构建了绝对路径,从 ...

  4. Java SE 11(18.9)中的API更新

    Java SE 11也被命名为18.9(基于使用发布年份和月份的新命名方案),预计将在9月的最后一周发布GA. 频繁发布新JDK版本的新方法是允许语言创建者引入新功能,并向开发人员社区更快地进行API ...

  5. java原生和SpringBoot读取jar包中MANIFEST.MF的方式

    我们经常看到java的一些jar包META-INF目录下包含一个MANIFEST.MF文件,里面包含一些版本信息,标题,实现组织,很多第三方的jar包还会自定义一个属性. 本文讲解如何读取jar包中M ...

  6. java url hostname_如何从URL字符串中提取主机名和端口?(How to extract hostname and port from URL string?)...

    如何从URL字符串中提取主机名和端口?(How to extract hostname and port from URL string?) 我需要从URL中提取主机名和端口(如果有的话),下面是我的 ...

  7. Java后台相关知识盘点(持续更新中)

    前言 本篇博客 取自于博主工作以来 对一些Java后台开发相关的 基础知识盘点和回顾, 主要涉及到Spring SpringBoot 和MyBatis相关的知识, 未来会一直更新下去- Spring ...

  8. java面试知识迷你版--持续更新中

    **部分知识来源JavaGuide等网络学习资源. java基础 内部类:静态内部类.成员内部类.局部内部类.匿名内部类. 重写(override)要求子类的返回值小于父类(类型相同),修饰符使用范围 ...

  9. java生成读取csv,从csv文件中获取Gatling

    加特林与馈线有很好的联系 . 当您提供错误的文件名或馈送文件的路径时,您将收到以下错误(java.lang.IllegalArgumentException:找不到馈送器文件) . 请注意,测试不会运 ...

最新文章

  1. 返回一个二维整数数组中的最大的子数组和
  2. HTML5 如何实现拖放'N'拖放
  3. python导入excel文件-python使用xlrd模块读写Excel文件的方法
  4. 数据挖掘十大经典算法之——K-Means 算法
  5. 一文弄懂各大池化Pooling操作
  6. weblogic9修改线程数设置
  7. mysql+phpmyadmin配置流程
  8. Hazelcast入门指南第3部分
  9. Oracle 软件的安装
  10. 敏捷开发需求文档_需求的长期,敏捷文档
  11. 【报告分享】2022十大科技趋势-达摩院.pdf(附下载链接)
  12. Iplimage设置感兴趣区域(ROI)
  13. ueditor 动态设置多语言
  14. android 读build.prop,Android build.prop简介
  15. Linux运维常用知识(1)
  16. leetcode75 颜色分类
  17. IOS FMDB 使用
  18. css布局入门级实战之九宫格网格布局
  19. STM32 USB音频麦克风实现
  20. 你上次被程序猿喷是因为啥?

热门文章

  1. [HAOI2015]树上操作
  2. ArcGIS API for javascript开发笔记(五)——GP服务调用之GP模型的发布及使用详解...
  3. [Android] android的消息队列机制
  4. 《中秋书月》月圆之夜,我和德鲁克
  5. ***大赛结果,名企员工缺乏安全意识
  6. Eclipse配置开发Go的插件——Goclipse
  7. IBatisNet基础组件
  8. MSMQ消息队列安装
  9. 利用SqlBulkCopy插入数据
  10. ORACLE SQL:经典查询练手第三篇