java URL和URI

【README】

本文阐述了 URL, URI,以及对应的java类的api;

  • 1.URI,统一资源标识符,标识互联网上的某个网络资源,标识方式如 名称,位置等;就像人的标识一样,可以通过身份证或学生证号或社保号码等来标识;(但不一定靠位置来标识)
  • 2.URL, 统一资源定位符,唯一标识一个资源在internet上的位置(仅靠位置来标识);所以 URL 是 URI标识网络资源的一种方式;即 URI可标识的资源范围比URL大;
  • 3.URL是一种URI
  • 4. URI 由 URL + URN(统一资源名称)组成

【1】URI,统一资源标识符

1)URI采用特定语法标识网络资源,URI 是一个标识资源的字符串而已;

2)URI标识语法  模式:模式特定部分;

2.1)模式包括(可以理解为资源协议):

  • data
  • file
  • ftp
  • http;
  • telnet;

2.2)模式特定部分采用一种层次结构,如 //authority/path?k1=v1&k2=v2#anchor ;

  • 其中 authority 表示授权机构,如 www.baidu.com 即服务器域名;
  • path 表示资源路径;
  • ? k1=v1&k2=v2 表示查询字符串;
  • #anchor 锚点,表示html页面的某个元素;

【2】URL,统一资源定位符

1)URL 是一种URI, 除了标识一个网络资源,还提供资源的网络位置,以便查找; 客户端可以用它获取资源;

2)资源的网络位置包括 协议如http,服务器主机域名,端口,路径(查询参数,锚点或有); 3)URL语法如下:协议://userInfo@host:port/path?query#fragment

  • 用户信息, 主机host,port端口合并在一起构成了权威机构;
  • 路径是指向服务器上的一个特定目录或文件,类似于unix的文件系统路径;
  • 查询字符串,向服务器提供了附加参数;
  • 片段, 指向远程资源的某个特定部分;

【3】URL java类例子

【3.1】创建URL

    @Testpublic void f1() throws MalformedURLException {URL url = new URL("http://www.baidu.com");System.out.println(url);System.out.println(url.getProtocol());System.out.println(url.getPort());System.out.println(url.getAuthority());}

http://www.baidu.com
http
-1
www.baidu.com

【3.2】创建URL-相对地址

@Testpublic void f2() throws IOException {URL url1 = new URL("https://blog.csdn.net/PacosonSWJTU/article/details/120964766");URL url2 = new URL(url1, "120980127"); // 相对地址System.out.println(url1.getPath()); // /PacosonSWJTU/article/details/120964766System.out.println(url2.getPath()); // /PacosonSWJTU/article/details/120980127}

从url获取数据(3种方式)

  • 方法1,使用 URL.openStream() ;
  • 方法2,使用 URL.openConnection 和 URLCOnnection.getInputStream() 方法;
  • 方法3,使用 URL.getContent() 方法;

补充,URL.openStream() 方法如下:

public final InputStream openStream() throws java.io.IOException {return openConnection().getInputStream(); // 获取输入流 }// 打开连接 
public URLConnection openConnection() throws java.io.IOException {return handler.openConnection(this);}

3.1)方法1,使用openStream() 方法

@Testpublic void f3() throws IOException {URL url1 = new URL("https://blog.csdn.net/PacosonSWJTU/article/details/120964766");try (DataInputStream dataInputStream = new DataInputStream(url1.openStream())) {int c;while((c = dataInputStream.read()) != -1) {System.out.print((char)c); // 有乱码 无法对中文进行解析}}}

改用基于UTF-8字符编码格式的 inputStreadReader 读取数据,(可以处理中文)如下:

@Testpublic void f4() throws IOException {URL url1 = new URL("https://blog.csdn.net/PacosonSWJTU/article/details/120964766");// 采用utf-8 编码,可以解析中文字符String str = null;try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(url1.openStream(), StandardCharsets.UTF_8))) {while((str = bufferedReader.readLine()) != null) {System.out.print(str);}}}

方法2,使用  URL.openConnection() 和 URLCOnnection.getInputStream() 方法 读取资源;

/*** @title 从URL获取资源内容-url1.openConnection()+urlConnection.getInputStream()方法* @author xiaotang* @updateTime 2021/10/31*/@Testpublic void f4_2() throws IOException {URL url1 = new URL("https://blog.csdn.net/PacosonSWJTU/article/details/120964766");// 采用utf-8 编码,可以解析中文字符String str = null;URLConnection urlConnection = url1.openConnection();try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), StandardCharsets.UTF_8))) {while((str = bufferedReader.readLine()) != null) {System.out.print(str);}}}

方法3,使用 URL.getContent() 方法读取资源

/*** 通过 getContent() 获取资源内容*/@Testpublic void f5() throws IOException {URL url1 = new URL("https://blog.csdn.net/PacosonSWJTU/article/details/120964766");// getContent() 获取资源内容Object o = url1.getContent();System.out.println(o);  // sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@694e1548}/*** 通过 getContent(Class[] classes) 获取资源内容*/@Testpublic void f6() throws IOException {URL url1 = new URL("https://blog.csdn.net/PacosonSWJTU/article/details/120964766");Class<?>[] arr = {String.class, Reader.class, InputStream.class};Object o = url1.getContent(arr);System.out.println(o);  // sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@694e1548InputStream inputStream = (InputStream) o ;BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));String result = null;while((result = bufferedReader.readLine()) != null) {System.out.println(result);}}

【3.3】分解URL

1)URL 包括5部分;

  • 模式,也称协议;
  • 授权机构;
  • 路径;
  • 片段标识符,或段或ref;
  • 查询字符串;
/*** @title 分解URL, URL 包括5部分* @author xiaotang* @updateTime 2021/10/31*/@Testpublic void f6() throws IOException {URL url = new URL("https://blog.csdn.net/PacosonSWJTU/article/details/120904564?k1=v1&k2=v2#anchor=1");System.out.println(url.getProtocol());System.out.println(url.getHost());System.out.println(url.getPort());System.out.println(url.getFile());System.out.println(url.getPath());System.out.println(url.getRef());System.out.println(url.getQuery());System.out.println(url.getUserInfo());System.out.println(url.getAuthority()); }

https
blog.csdn.net
-1
/PacosonSWJTU/article/details/120904564?k1=v1&k2=v2
/PacosonSWJTU/article/details/120904564
anchor=1
k1=v1&k2=v2
null
blog.csdn.net

2)URL相等性

  /*** @title URL 相等性* @author xiaotang* @updateTime 2021/10/31*/@Testpublic void f7() throws IOException {URL url1 = new URL("https://blog.csdn.net/PacosonSWJTU/article/details/120904564?k1=v1&k2=v2#anchor=1");URL url2 = new URL("https://blog.csdn.net/PacosonSWJTU/article/details/120904564?k1=v1&k2=v2#anchor=1");if (url1.equals(url2)) { // equals 底层调用了 sameFile() 方法System.out.println(url1 + "is equals to " + url2);} else {System.out.println(url1 + "is not equals to " + url2);}System.out.println(url1.sameFile(url2)); // true }

3)URL 比较

// URL比较,调用URl.toString() toExternalForm(), toURI()@Testpublic void f8() throws Exception {URL url1 = new URL("http://www.baidu.com?name=张三&city=成都#anchor=2");System.out.println(url1.toString()); //System.out.println(url1.toExternalForm());URI uri2 = url1.toURI(); // URL 转为 URI 类System.out.println(uri2);}

【4】URI类-统一资源标识符类

1)URI是 URL的抽象,不仅包括统一资源定位符URL,还包括统一资源名 URN;

2)URI 提供了网络资源的表示,但没有提供网络获取功能;而URL 提供了网络资源获取功能;

3)URI VS URL (非常重要)

  • 若想下载一个 URL的内容,应该使用URL;
  • 如果想用URL 来标识而不是获取网络资源(如一个 XML的命名空间),就应该使用 URI类;

补充:URI.toURL() 可以把 URI 转为 URL; URL.toURI() 可以把 URL 转为 URI;

简单说,URI是抽象的定义,不管用什么方法表示,只要能定位一个资源,就叫URI

本来设想的的使用两种方法定位:1,URL,用地址定位;2,URN 用名称定位。

举个例子:去村子找个具体的人(URI),如果用地址:某村多少号房子第几间房的主人 就是URL, 如果用身份证号+名字 去找就是URN了。

结果就是 目前WEB上就URL流行开了,平常见得URI 基本都是URL

4) URI vs URL 例子 (干货)

// URI vs URL URI 标识资源,URL 定位资源但可能无法标识某些资源@Testpublic void f14() throws Exception {URI voice = new URI("tel:+1-800-9988-9938"); // 电话URI book = new URI("urn:isbn:1-023-40287-9"); // 国际标准书号URI email = new URI("zhangsan@goole.com"); // 邮件// 打印 URISystem.out.println("==== 打印 URI");System.out.println(voice);System.out.println(book);System.out.println(email);// 打印 URLSystem.out.println("==== 打印 URL");System.out.println(new URL("http://www.baidu.com")); // http://www.baidu.com, 必须以协议开头 System.out.println(new URL("tel:+1-800-9988-9938")); // 会抛出异常哦System.out.println(new URL("urn:isbn:1-023-40287-9")); // 会抛出异常哦System.out.println(new URL("zhangsan@goole.com")); // 会抛出异常哦}

打印结果:

==== 打印 URI
tel:+1-800-9988-9938
urn:isbn:1-023-40287-9
zhangsan@goole.com
==== 打印 URL
http://www.baidu.com

java.net.MalformedURLException: unknown protocol: tel   // 抛出异常了


【4.1】构造URI

1)构建URI;

 // 相对uri@Testpublic void f11() throws Exception {URI uri = new URI("https://blog.csdn.net/PacosonSWJTU/article/details/120964766");System.out.println(uri);URI uri2 = uri.resolve("59483747"); // 相对地址 59483747System.out.println(uri2); // https://blog.csdn.net/PacosonSWJTU/article/details/59483747}

2)URI的各个部分

模式:模式特定部分:片段; 

 // 获取URI属性@Testpublic void f10() throws Exception {URI uri = new URI("https://blog.csdn.net/PacosonSWJTU/article/details/120904564?k1=v1&k2=张三#anchor=1");System.out.println(uri.isOpaque());System.out.println(uri.getAuthority());System.out.println(uri.getFragment());System.out.println(uri.getHost());System.out.println(uri.getPath());System.out.println(uri.getPort());System.out.println(uri.getQuery());System.out.println(uri.getUserInfo());/* 获取原生数据 */System.out.println("----------------- raw -------------------");System.out.println(uri.getRawAuthority());System.out.println(uri.getRawFragment());System.out.println(uri.getRawPath());System.out.println(uri.getRawQuery());System.out.println(uri.getRawUserInfo());System.out.println(uri.getRawSchemeSpecificPart());}

false

// 如果 URI是一个层次URI,则返回false; 若URI不是层次URI,即不是透明的,返回true
blog.csdn.net
anchor=1
blog.csdn.net
/PacosonSWJTU/article/details/120904564
-1
k1=v1&k2=张三
null
----------------- raw -------------------
blog.csdn.net
anchor=1
/PacosonSWJTU/article/details/120904564
k1=v1&k2=张三
null
//blog.csdn.net/PacosonSWJTU/article/details/120904564?k1=v1&k2=张三

【4.2】相对uri

 @Testpublic void f11() throws Exception {URI uri = new URI("https://blog.csdn.net/PacosonSWJTU/article/details/120964766");System.out.println(uri);URI uri2 = uri.resolve("59483747"); // 相对地址 59483747System.out.println(uri2); // https://blog.csdn.net/PacosonSWJTU/article/details/59483747}

【4.3】uri 字符串表示

toASCIIString 对中文字符采用了 x-www-form-urlencode格式 编码;

// uri 字符串表示@Testpublic void f12() throws Exception {URI uri = new URI("https://blog.csdn.net/PacosonSWJTU/article/details/120964766?name=张三");System.out.println(uri.toString()); // https://blog.csdn.net/PacosonSWJTU/article/details/120964766?name=张三 System.out.println(uri.toASCIIString());  // https://blog.csdn.net/PacosonSWJTU/article/details/120964766?name=%E5%BC%A0%E4%B8%89}

【4.4】uri 编码与解码

1) x-www-form-urlencoded

1.1)介绍: intro2 x-www-form-urlencode, refer2 

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Methods/POST

2)编码与解码

// 对url进行编码与解码 格式为 x-www-form-urlencode ;// intro2 x-www-form-urlencode, refer2 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Methods/POST@Testpublic void f13() throws Exception {System.out.println(URLEncoder.encode("hello world", StandardCharsets.UTF_8.displayName()));System.out.println(URLEncoder.encode("hello world 张三", StandardCharsets.UTF_8.displayName())); // 编码String str = URLEncoder.encode("hello world 张三", StandardCharsets.UTF_8.displayName());// 编码-> hello+world+%E5%BC%A0%E4%B8%89String decodedStr = URLDecoder.decode(str, StandardCharsets.UTF_8.displayName());// 解码->hello world 张三System.out.println(decodedStr);}

3)url编码方式

3.1)背景

在发明web时,unicode 还没有完全普及,所以并不是所有系统都可以处理 本(中文)之类的字符;为了解决这个问题,URL 中使用的字符必须来自 ASCII的一个固定的子集,包括:

  • 大写字母 A-Z‘;
  • 小写字母: a-z ;
  • 数组 0-9;
  • 标点符号字符  - _ . ! ~ * ` ( , ) 等;

3.2)url编码方式如下:

除了 ascii数字,字母和前面指定的标点符号外,所有其他字符都要转换为字节,每个字节要写为 百分号后面加两个16进制数字

空格是一种特殊情况, 因为它太普遍了;除了编码为 %20,还可以编码为 为加号+;加号本身编码为 %2B ;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329858.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HoloLens开发手记-全息Hologram

全息 Hologram HoloLens使我们可以通过周边世界的光线和声音来创建全息场景和物体&#xff0c;使得它们像真实物体那样。全息场景能够响应你的凝视、手势和语音指令&#xff0c;同时还会和你周边世界的表面交互。借助全息场景&#xff0c;你可以在周边世界创建数码物体。 class…

全网把Map中的hash()分析的最透彻的文章,别无二家。

转载自 全网把Map中的hash()分析的最透彻的文章&#xff0c;别无二家。你知道HashMap中hash方法的具体实现吗&#xff1f; 你知道HashTable、ConcurrentHashMap中hash方法的实现以及原因吗&#xff1f; 你知道为什么要这么实现吗&#xff1f; 你知道为什么JDK 7和JDK 8中hash方…

python下面的代码_解析一下下面的python代码?

class Model(dict, metaclassModelMetaclass): # 初始化, 没啥好说的 def __init__(self, **kw): super(Model, self).__init__(**kw) # 如果取不到值, 报错, 这是一个魔术方法, 使用时直接getattr(obj, key) def __getattr__(self, key): try: return self[key] except KeyErr…

SpringBoot多数据源(主从数据源)配置

&#x1f3b6;前言 学习springboot配置多数据源&#xff0c;先回顾一下springboot配置单数据源的方式 SpringBoot配置mybatis-mysql数据源 &#x1f520;主从数据源搭建 项目依赖 本次记录多数据源配置主要是通过druid mybatis plus aop的形式实现的&#xff0c;mybatis …

(转)HttpURLConnection与 HttpClient 区别

转自&#xff1a; HttpURLConnection与 HttpClient 区别/性能测试对比 - 尚码园HttpURLConnection与HttpClient随笔   目前在工做中遇到的须要各类对接接口的工做&#xff0c;须要用到HTTP的知识&#xff0c;工做完成后想要作一些笔记&#xff0c;原本知识打算把本身写的代码…

Raspkate - 基于.NET的可运行于树莓派的轻量型Web服务器

最近在业余时间玩玩树莓派&#xff0c;刚开始的时候在树莓派里写一些基于wiringPi库的C语言程序来控制树莓派的GPIO引脚&#xff0c;从而控制LED发光二极管的闪烁&#xff0c;后来觉得&#xff0c;是不是可以使用HTML5jQuery等流行的前端技术做一个简单的Web站点&#xff0c;让…

深入分析Java中的length和length()

转载自 深入分析Java中的length和length()在开始正文之前&#xff0c;请你快速回答如下问题&#xff1a;在不使用任何带有自动补全功能IDE的情况下&#xff0c;如何获取一个数组的长度&#xff1f;以及&#xff0c;如何获取一个字符串的长度&#xff1f;这个问题我问过不同水平…

归并排序示例

public class MergeSortMain {public static void main(String[] args) {int[] arr {5, 4, 6, 2, 3, 7, 9, 1, 8};sort(arr);print(arr);}static void sort(int[] arr) {sort(arr, 0, arr.length - 1);}/*** param arr 数组* param leftBound 左边界* param rightBoun…

windows监控txt写入_Windows的bug们

2020/9/26○Doriawinterwindows的锁屏界面我很喜欢&#xff0c;这个壁纸自动切换的模块叫windows聚焦&#xff0c;然而我某天开机时发现图片消失&#xff0c;变味了蓝色背景&#xff0c;如图&#xff1a;因为我的已经修好了&#xff0c;所以在网上找了一张一样的图&#xff0c;…

internet地址java表示

【README】 本文主要总结 internet地址相关知识&#xff0c;及相关的 java 类 &#xff1b; 0&#xff09;ip地址是什么 连接到internet的设备称为节点&#xff0c;计算机节点称为主机&#xff08;host&#xff09;&#xff0c;每个节点至少由一个唯一的数&#xff08;或数字…

微软也加入FB开放计算项目 发布交换机操作系统

微软3月10日宣布了一则震动技术业界的消息&#xff0c;它正式发布了基于Debian Linux的网络交换机操作系统。这款名为“SONiC”&#xff08;Software for Open Networking in the Cloud&#xff09;的软件以前仅供微软内部使用&#xff0c;主要运行在网络交换机上。 这条消息对…

Docker-Desktop储存路径更改

前言 Docker是一个非常好用的容器引擎, 使我们部署环境速度大幅度提升。但是windows版本的docker-desktop默认安装路径是C盘&#xff0c;这时候就有一个非常让人头疼的问题 -【C盘储存空间严重不足】。下面主要记录一下怎么解决这一个问题~ 原缓存路径 C:\Users${用户文件}\A…

深入解析String中的intern

转载自 深入解析String中的intern引言 在 JAVA 语言中有8中基本类型和一种比较特殊的类型String。这些类型为了使他们在运行过程中速度更快&#xff0c;更节省内存&#xff0c;都提供了一种常量池的概念。常量池就类似一个JAVA系统级别提供的缓存。 8种基本类型的常量池都是系统…

URLConnection-URL连接

【README】 本文介绍了 URLConnection java类&#xff0c;通过 URLConnection 如何获取网络资源&#xff1b;本文还梳理了涉及网络编程的java类的进化过程&#xff1b;从 URL -> URLConnection -> HttpURLConnection 或 HttpClient ; URL与URI的介绍&#xff0c; refer2…

excel趋势线公式导出_如何用Excel进行预测分析?

【面试题】一个社交APP, 它的新增用户次日留存、7日留存、30日留存分别是52%、25%、14%。请模拟出来&#xff0c;每天如果日新增6万用户&#xff0c;那么第30天&#xff0c;它的日活数会达到多少&#xff1f;请使用Excel进行分析。【分析思路】第1日(次日)留存用户数第1日新增用…

ASP.NET Core 行军记 -----第一步(艰辛的 MVC Hello World)

现在ASP.NET Core还在不断成长、更新中&#xff0c;说不定到了明天又换了个模样&#xff0c;就如同一个小孩&#xff0c;从蹒跚学步&#xff0c;到奔向未来。 所以我们可以相应的去理解更新中所发生的变化&#xff0c;包容它、呵护它&#xff0c;而不是盲目的指责与批评&#x…

记录一下SpringCloud-Gateway使用lb动态路由遇到的坑

前言 前一段时间&#xff0c;学习springcloud-alibaba时候&#xff0c;学习到gateway组件与nacos注册中西一起使用时遇到了一个问题在此记录一下&#xff0c;避免以后遇到又做无用功。 问题 通过gateway配置路由时&#xff0c;uri参数使用lb://xxxx无法映射到对应的服务地址…

Java程序创建Kafka Topic,以及数据生产消费,常用的命令

转自&#xff1a; Java程序创建Kafka Topic&#xff0c;以及数据生产消费&#xff0c;常用的命令_Zyy_z_的博客-CSDN博客_java kafka创建topicKafka简介&#xff1a; Kafka是一个分布式发布——订阅消息传递系统。Kafka快速、可扩展且耐用。它保留主题中的消息源。生产者将数据…

c++ 凸包 分治算法_三维凸包

缘起众所周知&#xff0c;二维凸包可以使用 Graham 扫描 内解决.所以本文来学习一下三维空间中凸包的一种直观算法——增量算法(increment algorithm)分析有一条叫 Willy 的苹果虫一直快乐的居住在一个苹果中&#xff0c;直到有一天有一只仓鼠想吃这个苹果&#xff0c;Willy 自…

深度分析Java的ClassLoader机制(源码级别)

转载自 深度分析Java的ClassLoader机制&#xff08;源码级别&#xff09;Java中的所有类&#xff0c;必须被装载到jvm中才能运行&#xff0c;这个装载工作是由jvm中的类装载器完成的&#xff0c;类装载器所做的工作实质是把类文件从硬盘读取到内存中&#xff0c;JVM在加载类的时…