当前位置: 首页 > article >正文

JAVA URL和URI差异对比

以下是 Java 中 URLURI 的对比分析,结合代码示例说明差异:


1. 核心定义差异

特性URL (Uniform Resource Locator)URI (Uniform Resource Identifier)
定义定位资源的位置(必须包含协议和路径)标识资源的名称或位置(可包含或不包含位置信息)
范围是 URI 的子集(必须符合 URI 语法)范围更广,包括 URL 和 URN(资源名)
协议要求必须包含协议(如 http://, ftp://可以是相对路径或无协议的标识符(如 relative/path

2. 功能对比

URL 类
  • 用途:专门用于网络资源定位和访问。
  • 方法
    • openConnection():打开网络连接。
    • getProtocol(), getHost(), getPort():获取协议、主机、端口等信息。
    • 支持完整的网络操作(如下载文件、发送请求)。
URI 类
  • 用途:解析和操作资源标识符的结构。
  • 方法
    • getPath(), getQuery(), getFragment():解析路径、查询参数、片段。
    • normalize():规范化 URI(处理 .././)。
    • resolve(String reference):解析相对路径。

3. 代码示例对比

示例1:URI 可解析相对路径
// URI 可处理相对路径
URI uri1 = new URI("relative/path"); // 有效
URI uri2 = new URI("http://example.com/path?query=1"); // 有效

// URL 必须包含协议
URL url = new URL("http://example.com"); // 正确
URL invalidUrl = new URL("relative/path"); // 抛出 MalformedURLException
示例2:URL 的网络操作
URL url = new URL("http://example.com/file.txt");
URLConnection connection = url.openConnection(); // 打开连接
InputStream inputStream = connection.getInputStream(); // 读取资源
示例3:URI 的路径解析
URI uri = new URI("http://example.com:8080/path?query=1#fragment");
System.out.println("Scheme: " + uri.getScheme());        // http
System.out.println("Host: " + uri.getHost());            // example.com
System.out.println("Port: " + uri.getPort());            // 8080
System.out.println("Path: " + uri.getPath());            // /path
System.out.println("Query: " + uri.getQuery());          // query=1
System.out.println("Fragment: " + uri.getFragment());    // fragment

4. 异常处理对比

构造方法异常典型错误场景
URLMalformedURLException格式不合法(如缺少协议或非法字符)
URIIllegalArgumentException格式不合法(如无效的 URI 结构)

5. 性能差异

  • URI:解析更快,因为仅需验证语法。
  • URL:创建时需更多验证(如协议检查、网络可达性预检),开销更大。

6. 使用场景建议

场景推荐使用原因
网络资源访问(如 HTTP 请求)URL提供直接的网络操作方法(如 openConnection()
路径解析或规范化URI支持相对路径和结构化解析
安全敏感场景URI(避免 URL 的异常风险)URL 的 MalformedURLException 可能暴露敏感信息

总结

  • URL:专为网络定位设计,适合直接操作资源。
  • URI:通用资源标识符,适合解析、存储和操作资源路径。
  • 转换关系:可通过 URI.toURL() 将 URI 转换为 URL(需确保 URI 是有效的 URL 格式)。

http://www.kler.cn/a/594165.html

相关文章:

  • 星型组网和路由器组网的区别
  • UMA架构下的GPU 显存
  • CSS 用于图片的样式属性
  • 基于微信小程序的充电桩管理系统
  • vector和list的区别是什么
  • OpenCV第1课OpenCV 介绍及其树莓派下环境的搭建
  • 如何用日事清做研发目标、需求、规划、迭代、Bug、效能、复盘、绩效一站式管理
  • 前后端联调解决跨域问题的方案
  • 基于springboot的房产销售系统(016)
  • Linux 一步部署DHCP服务
  • mysql5.6忘记密码怎么重置mysql密码
  • rust学习笔记16-206.反转链表(递归)
  • 第7章 类与面向对象
  • Kotlin v2.1.20 发布,标准库又有哪些变化?
  • 使用Java爬虫根据关键词获取Shopee商品列表?
  • 渲染模式、基础组件、矢量图、样式设置——微信小程序学习笔记
  • 14-图论-多源最短路径Floyd算法
  • 蓝桥杯备考----》贪心之删数问题
  • 当了5年牛马,我开始划水了。。。
  • Spring MVC 参数校验-校验注解