https://blog.csdn.net/readiay/article/details/52862379

看开源框架经常看到会用到URL或者URI之类的,为什么要熟悉这个呢?

比如说你写一个网络程序,需要访问资源,资源位置信息最好封装起来,如果使用String表示,虽然可以使用,但是感觉挺low的。你用了URI或者URL,当你想获取这个资源位置信息的某个属性时怎么着也比String方便吧。

[TOC]

## 1、URI与URL的定义

URI:统一资源标志符(Uniform Resource Identifier)

URL:统一资源定位符(uniform resource location)

说白了,URI与URL都是定位资源位置的,就是表示这个资源的位置信息,就像经纬度一样可以表示你在世界的哪个角落。URI是一种宽泛的含义更广的定义,而URL则是URI的一个子集,就是说URL是URI的一部分。

换句话说,每个URL都是URI,但是不是每个URI都是URL的。他们之间最明显的不同就是在java.net.URI你只能看到他的一些属性,他只是表示一个位置,但是你没有办法通过URI获取到这个对象的流,但是URL就不同了。java.net.URL该类提供方法(openConnection()),通过该方法我们可以通过IO流操作他。但是URI中我貌似没看到相关的方法。

也就是说:URL是可以直接操作的,但是URI并不行。(如果你发现这句话不对,麻烦告诉我下)

## 2、URL的语法

URL与URI很像,两者的格式几乎差不多,但是我们接触的还是URL比较多,就以URL为例说明

URL提供了一种访问定位因特网上任意资源的手段,但是这些资源可以通过不同的方法(例如HTTP、FTP、SMTP)来访问,不管怎样,他都基本上由9个部分构成:

://:@:/;?#

scheme:获取资源使用的协议,例如http、ftp等,没有默认值

user:password:用户名与密码,这个是一个特殊的存在,一般访问ftp时会用到,他显示的表明了访问资源的用户名与密码。但是这个可以不写,不写的话可能会让你输入用户名密码

host:主机,访问那台主机,有时候可以是IP,有时候是主机名,例如www.baidu.com

port:端口,访问主机时的端口,如果http访问默认80,可以省略。

path:通过host:port我们能找到主机,但是主机上文件很多,通过path则可以定位具体文件。例如www.baidu.com/file/index.html。则path是/file/index.html,表示我们访问/file/index.html这个文件,他很像linux上的路径。

params:这个很少见,主要作用就是像服务器提供额外的参数,用来表示本次请求的一些特性。例如ftp传输模式有两种,二进制和文本,你肯定不希望使用文本形式传输二进制图片,这样你的图片下载下来后可能没法看了。为了向应用程序提供更丰富的信息,URL中有个专门的部分来表示这种参数。例如ftp://file.qiandu.com/pub/guid.pdf;type=d其中的type=d就是params

query:通过get方式请求的参数,例如:www.qiandu.com/index.html?username=dgh&passwd=123

fragment:例如www.qiandu.com/index.html#1。当html页面比较长时,我们通常会将其分为好几段,#1就可以 快速定位到某一段。

## 3、Java中对URI的操作类

```

@Test

public void uriTest() throws Exception{

URI uri = new URI("https://www.qiandu.com:8080/goods/index.html?username=dgh&passwd=123#j2se");

System.out.println("scheme : " + uri.getScheme());

System.out.println("SchemeSpecificPart : " + uri.getSchemeSpecificPart());

System.out.println("Authority : " + uri.getAuthority());

System.out.println("host : " + uri.getHost());

System.out.println("port : " + uri.getPort());

System.out.println("path : " + uri.getPath());

System.out.println("query : " + uri.getQuery());

System.out.println("fragment : " + uri.getFragment());

}

```

运行上面的代码,然后得到如下的结果:

## 4、Java中对URL的操作

```

@Test

public void urlTest() throws Exception{

URL url = new URL("https://www.qiandu.com:8080/goods/index.html?username=dgh&passwd=123#j2se");

System.out.println("URL: " + url.toString());

System.out.println("protocol: " + url.getProtocol());

System.out.println("authority: " + url.getAuthority());

System.out.println("file name: " + url.getFile());

System.out.println("host: " + url.getHost());

System.out.println("path: " + url.getPath());

System.out.println("port: " + url.getPort());

System.out.println("default port:" + url.getDefaultPort());

System.out.println("query: " + url.getQuery());

System.out.println("ref: " + url.getRef());

}

运行上面的代码,得到以下结果:

```

![](https://box.kancloud.cn/b979ae6159978ed2d2b716a51eaa98da_469x213.png)

## 5、UserInfo属性

其实关于资源定位的时候还有一种写法,就是类似于

`sftp://tomcat@www.qiandu.com///app/index.pdf`

就是在主机名前面有类似于xxx@的东西,其实这种表示就:用户@主机名或者用户@IP。@前面表示登录主机的用户,也就是UserInfo了。

![](https://box.kancloud.cn/c95721dae2c2216ecdf9ff1f5a83460f_563x183.png)

android uri详解,URI与URL详解相关推荐

  1. Android 中ContentProvider和Uri详解

    一.使用ContentProvider(内容提供者)共享数据 ContentProvider在android中的作用是对外共享数据,也就是说你可以通过ContentProvider把应用中的数据共享给 ...

  2. 【Android】ContentProvider和Uri详解

    原文来自:http://www.cnblogs.com/linjiqin/archive/2011/05/28/2061396.html 一.使用ContentProvider(内容提供者)共享数据 ...

  3. 详解URI、URN、URL

    先举一个例子,让大家对这三个名词又一个基本的概念: 1⃣️ ftp://ftp.is.co.za/rfc/rfc1808.txt 2⃣️ http://www.cnblogs.com/nods/p/8 ...

  4. android WebView详解,常见漏洞详解和安全源码(下)

    上篇博客主要分析了 WebView 的详细使用,这篇来分析 WebView 的常见漏洞和使用的坑.  上篇:android WebView详解,常见漏洞详解和安全源码(上)  转载请注明出处:http ...

  5. android WebView详解,常见漏洞详解和安全源码(上)

    这篇博客主要来介绍 WebView 的相关使用方法,常见的几个漏洞,开发中可能遇到的坑和最后解决相应漏洞的源码,以及针对该源码的解析.  由于博客内容长度,这次将分为上下两篇,上篇详解 WebView ...

  6. android组件用法说明,Android第三方控件PhotoView使用方法详解

    Android第三方控件PhotoView使用方法详解 发布时间:2020-10-21 15:06:09 来源:脚本之家 阅读:74 作者:zhaihaohao1 PhotoView的简介: 这是一个 ...

  7. 融云android聊天界面,Android 融云IM集成以及使用详解(一)

    Android 融云IM集成以及使用详解(一) 集成 1.具体的集成步骤就不在详细介绍,我们只说干货,附上融云IM官方文档地址,里面有更为详细的集成介绍 https://www.rongcloud.c ...

  8. Android 融云IM集成以及使用详解(二)

    Android 融云IM集成以及使用详解(二) 上篇讲解了集成和好友列表和消息记录的使用,这篇将讲解聊天界面和群聊界面的使用 先附上一张效果图 先介绍布局文件 <LinearLayout xml ...

  9. Android工程师面试宝典面试实战试题详解01

    1. 什么是Activity? 四大组件之一,一般的,一个用户交互界面对应一个activity setContentView() ,// 要显示的布局 , activity 是Context的子类,同 ...

  10. Android进阶笔记:Messenger源码详解

    Messenger可以理解为一个是用于发送消息的一个类用法也很多,这里主要分析一下再跨进程的情况下Messenger的实现流程与源码分析.相信结合前面两篇关于aidl解析文章能够更好的对aidl有一个 ...

最新文章

  1. BZOJ2957:楼房重建(线段树)
  2. python入门只需20分钟-史上最详细python学习路线-从入门到精通,只需5个月时间...
  3. python流程控制语句-【Python学习之三】流程控制语句
  4. MySQL常用简单小命令
  5. 07-爬虫验证码破解实战
  6. 【学习笔记4】Action名称的搜索顺序
  7. Dream City(01背包+小贪心)acm寒假集训日记21/12/30
  8. Silverlight Code Samples
  9. leetcode数组相关
  10. 华为将发布鲲鹏 920 芯片数据;三星 S10 自燃;Mageia 7 正式发布 | 极客头条
  11. Notefile for Mac(记事本工具)支持12系统
  12. word中带圈字符字体显示大小和位置不正常
  13. Springboot URL Rewrite
  14. 线性时变系统状态方程的解
  15. 怎么才能够坚持做一件事并且把它做好?
  16. Openbravo体验
  17. 华三模拟器:路由备份路由聚合
  18. 计算机应用基础中级,《计算机应用基础》中级测试题-针对考题实操
  19. python读取ods格式的表格文件
  20. ATTCK权限提升-Linux提权总结

热门文章

  1. VC编程中经常能遇到LNK2005错误
  2. 微信小程序map地图的使用
  3. c语言求婚代码大全,继“代码求救”后,程序员用40行代码求婚成功!
  4. Hadoop企业级搭建之-组网设计(收敛比)
  5. Linux 定时释放内存cache 定时清理缓存
  6. oracle获得当前系统时间精确到毫秒,oracle获取当前时间,精确到毫秒并指定精确位数的实现方法...
  7. 【原创】Ichunqiu云境 —— Endless(无间计划) Writeup
  8. 位置式PID控制算法
  9. Python期末复习题:字符串与产生随机数
  10. php泥浆是什么,深厚砂性土层钻孔桩中PHP泥浆应用