Java的URI类

news2024/11/25 19:15:49

文章目录

    • 1. 简介
    • 2. 构造一个URI
    • 3. URI的各个部分
    • 4. 解析相对URI
    • 5. 相等性和比较
    • 6. 字符串表示

1. 简介

URI是对URL的抽象,不仅包含统一资源定位符,还包括统一资源名(URN)。实际使用的URI大多是URL,但大多数规范和标准都是用URI定义的,在Java中用java.net.URI类表示,这个类与java.net.URL类的区别表现在3个重要的方面:

  • URI类完全有关于资源的标识和URI的解析。它没有提供方法来获取URI所标识资源的表示
  • 相比于URL,URI类与相关的规范更一致
  • URI对象可以表示相对URI,URL类在存储URI时会将其绝对化。

简而言之,URL对象是对应网络获取的应用层协议的一个表示,而URI对象纯粹用来解析和处理字符串。URI类没有网络获取功能,尽管URL类有一些字符串解析方法,如getFIle等,但其中很多方法都有问题,与相关的规范要求的行为不完全一样。正常情况下,假如你想下载一个URL的内容,应该使用URI类,如果想使用URL来完成表示而不是获取(例如表示一个XML的命名空间),就应该使用URI类,二者都需要时使用toURI将URL对象转换为URI对象,或使用toURL将URL对象转换为URI对象。(见我这篇博客)

2. 构造一个URI

URI从字符串构造,可以把整个URI通过一个字符串传入构造函数,也可以部分传入

//根据任何满足条件的字符串创建一个新的URI对象
public URI(String uri)throws URISyntaxException
//需要一个模式的特定部分,主要用于非URI。模式是URI的协议,
public URI(String scheme,String schemeSpecificPart, String fragment)throws URISyntaxException
public URI(String scheme,String host ,String path, String fragment)throws URISyntaxException
public URI(String scheme,String authority, String path,String Query,String fragment)throws URISyntaxException
public URI(String scheme,String userInfo,String host,String query,int port ,String path, String query,String fragment)throws URISyntaxException

与URL类不同,URI类不依赖底层任何协议处理器,只要语法正确,java就不需要为了创建URI对象而理解协议,因此,不同于URL类,URI类可以用于新的实验性的URI模式。如果你确信你的URI是有效的,不违反任何规则,那么可以使用静态工厂方法URI.create(),与构造函数不同,它不会抛出URISyntaxException。

3. URI的各个部分

URI引用包括最多的三个部分:模式、模式特定部分和片段标识符,一般格式为:模式:模式特定部分:片段。URI提供了一些获取方法,可以返回各个URI对象的这三个部分。getRawFoo()方法返回URI各个部分的编码形式,相应的getFoo()方法首先对所有百分号转义的字符进行编码,然后返回编码的各个部分。

public String getScheme()
public String getSchemeSpecificPart()
public String getRawSchemeSpecificPart()
public String getRawFragment()

isAbsolute()方法会检查一个URI是绝对URI还是相对URI,如果没有模式则为绝对URI,否则为相对URI。模式特定部分的细节根据模式类型不同会有差别,例如tel URI中,模式特定语法类似于电话号码,模式特定部分都有一个特定的分层格式,划分为授权机构、路径和查询字符串。授权机构进一步分为用户信息、主机和端口。如果URI是一个层次URI时,isOpaque()会返回false,否则就会返回true。 如果URI不透明,只能得到模式、模式特定部分和片段标识符。不过,如果URI是层次URI,那么URI所有不同部分都会有相应的获取方式。

在计算机网络中,URI(Uniform Resource Identifier,统一资源标识符)是用于标识和定位资源的字符串。URI可以分为透明(transparent)和不透明(opaque)两种类型。

  • 透明URI:透明URI包含可以直接解读和理解的信息。例如,一个透明URI可以包含网络协议(如http://或https://)、域名(如www.example.com)和路径(如/resource)等信息。这些信息可以被计算机和网络设备直接解析和使用,以定位和访问资源。透明URI通常用于Web浏览器和其他网络应用程序中。
    示例透明URI:https://www.example.com/resource
  • 不透明URI:不透明URI是指包含一些不可直接解析或理解的信息的标识符。这种类型的URI可能包含加密数据、特定的内部标识符或其他对外部用户来说是不可见或不可理解的信息。不透明URI一般不会被直接使用于网络浏览器或应用程序,而是在应用程序内部使用,用于内部逻辑或身份验证等目的。
    示例不透明URI:example://internal/resource/1234

需要注意的是,透明URI和不透明URI的定义并非严格规定,而是根据上下文和使用环境而定。有时,不同的应用程序或系统可能会使用相同的URI格式,但其解释和处理方式可能不同。因此,在具体的应用或协议中,需要查阅相关文档以了解URI的使用方式和解析规则。

public String getAuthority()
public String getFragment()
public String getHost()
public String getPath()
public String getPort()
public String getQuery()
public String getUserInfo()

上面这些方法都会返回解码后的部分。(加密的部分会进行还原)如果希望得到URI原始的编码部分,见下面方法:

public String getRawAuthority()
public String getRawFragment()
public String getRawPath()
public String getRawQuery()
public String getRawUserInfo()

出于各种技术的原因Java并不会总是在开始就检测授权机构部分中的语法错误,但这个没有多少实际影响。不做这个检测的直接后果是,一般无法返回授权机构的各个部分:端口、主机和用户信息。在这种情况下,可以调用parseServerAuthirity(),强制重新解析授权机构。

4. 解析相对URI

URI类提供了3个方法可以在绝对和相对URI之间来回的切换

public URI resolve(URI uri)
public URI resolve(String uri)
public URI relativize(URI uri)

resolve()方法将uri参数与这个URI进行比较,并用它构造一个URI对象,这个对象包装了一个绝对的URI

public class QuizCardBuilder {
    public static void main(String[] args) throws URISyntaxException {
      URI absoulte=new URI("http://www.example.com/");
      URI relatice=new URI("images/logo.png");
      System.out.println(absoulte.resolve(relatice));
    }
}

在这里插入图片描述
如果调用本身不包含绝对URI,那么resolve方法将尽可能地解析URI,并返回一个新的相对URI对象作为结果。

public class QuizCardBuilder {
    public static void main(String[] args) throws URISyntaxException {
      URI absoulte=new URI("javafaq/books/");
      URI relatice=new URI("images/logo.png");
      System.out.println(absoulte.resolve(relatice));
    }
}

在这里插入图片描述
还可以反向完成以上过程,即从绝对URI变为相对URI。relativeize()方法根据相对于调用URI的uri参数创建一个新的URI对象。

public class QuizCardBuilder {
    public static void main(String[] args) throws URISyntaxException {
      URI absoulte=new URI("http://www.example.com/iamges/log.png");
      URI relatice=new URI("http://www.example.com/");
      System.out.println(relatice.relativize(absoulte));
    }
}

在这里插入图片描述

5. 相等性和比较

URI的比较和URL一样不是单纯的字符串比较,相等的URI必须都是层次的或不透明的。比较模式和授权机构是不考虑大小写。也就是说,http和HTTP是相同的模式,www.example.com与www.EXAMPLE.com是相同的授权机构。URI的其余部分要区分大小写。转义字符在比较之前不会解码。

  • hashcode()方法与相等性是一致的,相等的URI具有相等的散列值。
  • URI不同与URL它实现了Comparable接口,因此URI可以排序,基于各个部分的字符串比较,按一下顺序进行排序:
  1. 如果模式不同就比较模式,不考虑大小
  2. 否则,如果模式相同,一般认为有层次的URI小于有相同模式的不透明URI
  3. 如果两个URI都是不透明的URI,则根据模式的特定部分对它们排序
  4. 如果模式和不透明的模式特有部分都相同,就根据片段比较URI
  5. 如果两个URI都是层次URI,则根据它们的授权机构部分排序,授权机构本身依次,根据用户信息、主机和端口排序。主机比较不区分大小
  6. 如果模式和授权机构都相等,就使用路径来区分
  7. 如果路径也相等,就比较查询字符串
  8. 如果查询字符串也相等,就比较片段

6. 字符串表示

有两个方法可以将URI对象转换为字符串:

public String toString()
public Stirng toASCIIString()

前者返回URI的未编码的字符串,因此这个方法的结果不能保证是一个语法正确的URI,尽管实际上它是正确的。后者返回URI编码的字符串形式,会进行解码。

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

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

相关文章

spring高频面试题

什么是IOC Spring框架提供的一种容器,用于控制对象的创建和对象之间的调用,通过IOC容器把对象的创建和调用过程交给Spring进行管理,省去了使用 new的方式创建对象。 所谓依赖注入(DI),就是由IOC容器在运行期间,动态地将某种依赖关…

生态系统模型:SolVES、DNDC、CMIP6、GEE林业、APSIM、InVEST、无人机遥感、ArcGIS Pro模型等

基于R语言APSIM模型高级应用及批量模拟实践技术 CMIP6 数据处理方法与典型案例分析实践技术 Python 与 Noah-MP 陆面过程模型融合技术及在站点、区域模拟实践应用 双碳目标下基于“遥感”融合技术在碳储量、碳收支、碳循环等多领域监测与模拟实践应用 基于Citespace和vosvi…

扩展定时器功能说明

计数和定时 ⚫ 16bit upcounter ⚫ 上升沿或下降沿计数 ⚫ 计数初值和终值可配置 ⚫ 计数值大于等于比较值时触发中断 ⚫ 计数溢出后自动重载 ⚫ 计数周期中可以通过改写重载寄存器修改下一周期长度 支持16bit计数或级联的32bit计数。当CNTSEL0,计数器为16bit&#…

快手新财报:曙光就在冲刺路上?

自短视频爆火以来,短视频行业的头部玩家——抖音和快手就迎来了飞速发展,甚至一度成为了国民“杀时间利器”。然而,随着互联网红利逐渐见顶,短视频行业竞争加剧,哪怕作为头部玩家,快手的日子也并不好过。 …

Tatuk GIS Developer Kernel for .NET 11.77 Crack

Tatuk GIS Developer Kernel for .NET 是一个变体,它是受控代码和 .NET GIS SDK,用于为用户 Windows 操作系统创建 GIS 专业软件的过程。它被认为是一个完全用于 Win Forms 的 .NET CIL,WPF 的框架是为 C# 以及 VB.NET、VC、oxygen 以及最终与…

Learn From Microsoft Build Ⅰ:OpenAI

点击蓝字 关注我们 编辑:Alan Wang 排版:Rani Sun 微软 Reactor 为帮助广开发者,技术爱好者,更好的学习 .NET Core, C#, Python,数据科学,机器学习,AI,区块链, IoT 等技术&#xff0…

android性能测试-内存详解

Android性能测试-内存详解 名称说明Native HeapNative代码分配的内存,虚拟机和Android框架分配内存。关于什么是Native代码,即非Java代码分配的内存。Dalvik HeapJava对象分配的占据内存Dalvik Other类数据结构和索引占据内存Stack栈内存Other dev内部dr…

盐城北大青鸟东台基地IT精英挑战赛设计类作品展示

北大青鸟IT精英挑战赛作品展示——《黄小果》 这是我们22级新生王欣怡的作品,她是一位很优秀的 学生,经过一年的学习能够熟练的制作表情包

怎样让GPT教我用Python进行数据可视化

文章目录 怎样让GPT教我用Python进行数据可视化matplotlibpyecharts总结 怎样让GPT教我用Python进行数据可视化 🚀🚀首先,我们先看一下这段代码,这是我之前写来读取excel文件中xx大学在各个类别中的获奖情况,并保存在…

机器学习之机器如何学习

通过Julia的语法、函数、编译器使机器学习技术变得更加简单。 1、机器学习如何工作 通过机器学习,研究人员可以构造算法,使计算机自身能够在大量的数据中找到数学模式,而这是人类不可能做到的。想想看: 如果我问你,你怎么知道一张…

Padstack editor 绘制SMD Pin,Thru Pin和Via

一,椭圆形状的SMD PIN 的创建(例如:0.55/0.23 补偿后 0.95/0.28) 1,在select padstack usage 中选择 SMD Pin ;select pad geometry中选择 Oblong; 2,先将左下角 decimal places中的值设置为2&…

Java内部类(成员内部类、局部内部类、静态内部类、匿名内部类)

目录 ①. 什么是内部类 ②. 内部类的共性 ③. 为什么需要内部类 ④. 成员内部类 ⑤. 局部内部类 ⑥. 静态内部类(嵌套类) ⑦. 匿名内部类 ①. 什么是内部类 内部类是指在一个外部类的内部再定义一个类。内部类作为外部类的一个成员,并…

C++常用的支持中文的GUI库Qt 6之三: 项目的发布

C常用的支持中文的GUI库Qt 6之三: 项目的发布 本文接着上一篇“C常用的支持中文的GUI库Qt 6之二:项目的结构、资源文件的使用” https://blog.csdn.net/cnds123/article/details/130741807介绍,并使用其中的例子。 程序代码能正确编译运行&…

1. Tomcat整体架构及其设计精髓分析

MySQL性能调优 1.Tomcat的整体架构1.1 Tomcat介绍1.1.1 Servlet基础回顾 1.2 目录结构1.3 web应用部署的方式1.4 结合Server.xml理解Tomcat架构1.5 架构图 2. Tomcat核心组件详解2.1 Server 组件2.2 Service组件2.3 连接器Connector组件2.3.1 ProtocolHandler 组件2.3.1.1 EndP…

全志V3S嵌入式驱动开发(移植linux kernel和rootfs)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 除了少部分嵌入式设备使用vxworks和freertos之外,大部分嵌入式都是使用linux来做基础os来使用的。linux使用场景很多,除了大…

智慧城市同城V4小程序V2.24独立开源版 + 全插件+VUE小程序开源前端+最新用户授权接口

智慧城市同城V4小程序V2.22开源独立版本月最新版,与上一版相比修复了一些小细节,功能本身并无大的变化。新版系统包含全插件、包括很多稀缺收费的插件都在里面如括招聘、 家政等,外加小程序的VUE开源前端,整个系统全开源&#xff…

chatgpt赋能python:PythonTic:了解一种强大的测试框架

Python Tic: 了解一种强大的测试框架 当你编写代码时,测试通常是不可或缺的一部分。Python Tic是一个出色的测试框架,它可以帮助您自动化测试和验证您的代码。 简介 Python Tic是一种基于Python的测试框架,它能够测试您的代码的各个方面&a…

鹅厂程序员的9个生存法则

👉腾小云导读 本文作者在腾讯多年,主要从事的是腾讯云CDN、EdgeOne产品的后台研发工作。作者在云计算领域遇到了不少代码设计和程序设计的问题,他对于如何把项目中的代码标准化、提高开发维护的效率,做了总结梳理。本篇为各位分享…

解密Java Class文件不为人知的秘密

Java 诞生多年,因此在网络上,有关 Java Class 文件格式解析的文章有很多,但他们大多数都是在列举《Java 虚拟机》中定义的格式,通读下来,好像所有的东西都讲清楚了,但是我个人好像并没有看懂,不…

舵机云台实现体感姿态跟随功能

1. 功能说明 本文示例将实现R207样机舵机云台根据六轴陀螺仪传感器数据实现姿态跟随的功能。 2. 电子硬件 在这个示例中,我们采用了以下硬件,请大家参考: 主控板 Basra主控板(兼容Arduino Uno)‍ 扩展板 Bigfish2.1扩…