什么是URL和URI

URL类

URL可以唯一地标识一个资源在 Internet 上的位置。

URL类是 Java 程序在网络上定位和获取数据的最简单的方法。URL除了标识一个资源,还会为资源提供一个特定的网络位置,客户端可以用来获取这个资源的一个表示。而URI,只能告诉你一个资源是什么,但是无法告诉你它在那里,以及如何得到这个资源。

URL语法

URL语法为:protocol://userInfo@host:port/path?query#fragment

  • 协议部分:file,ftp,http,https,magnet,telnet
  • 用户信息:服务器登录信息
  • 用户信息,主机,端口在一起构成权威机构
  • 查询字符串向服务器提供附加参数。一般只在http URL中使用,包含表单数据,作为输入提供给在这个服务器上运行的程序。
  • 片段:指向远程资源的某个特定部分。片段标识符目标在HTML文档中用Id属性创建。

相对URL

继承了父文档的部分信息,这些不完整的URL称为相对URL。相反,完整指定的URL称为绝对URL。

如果相对链接以“/”开头,那么它相当于文档根目录,而不是相对于当前文件。

如浏览 http://www.aaa.com/test/1.text

点击下面的连接

<a href="/new/2.text">

浏览器会去掉/test/1.text,将/new/2.text附加到 http://www.aaa.com后面

相对URL允许用多种协议来提供一个文档树。最重要的是,相对URL允许将整个文档树从一个网站移动或复制到另一个网站,而不会破坏所有的内部链接。

URL类的特点

java.net.URL 类是对统一资源定位符的抽象。是一个final类,不能对其派生子类。

URL类不采用继承来配置不同类型的URL实例,而是采用策略设计模式,协议处理器是策略,URL类构成上下文,通过它来选择不同的策略。

URL是不可变的,因此它们是线程安全的。

URL类的API

创建新的URL

URL(String url) throws MalformedURLException

URL(String protocol,String hostname,String file)

URL(String protocol,String host,int port,String file)

URL(URL base,String relative)

注意:除了验证能否识别URL模式外,Java不会对它构造的URL完成任何正确性检查。

从URL中获取数据

InputStream openStream() throws IOException

URLConnection openConnection() 如果希望与服务器直接通信,使用这个方法

URLConnection openConnection(Proxy proxy)

Object getContent()

Object getContent(Classp[ ] classes)

分解URL

URL由模式(协议),授权机构,路径,片段标识符,查询字符串组成。可通过如下方法获取:

getFile(),getHost(),getPort(),getProtocol(),getRef(),getQuery(),getPath(),getUserInfo(),getAuthority()

相等性比较

当且仅当两个URL都指向相同的主机,端口和路径上的相同资源,且有相同片段标识符和查询字符串,才认为两个URL是相等的。但是equals()方法会尝试使用DNS解析主机,判断主机是否相同。

警告:URL上的equals()可能是一个阻塞的I/O操作,应避免将URL存储在依赖equals()的数据结构中,如hashMap。更好的选择是URI,必要时将URI和URL来回转换。

转换

toString(),toExternalForm() 两者基本相同

toURI() 将URL对象转换为URI对象

对于绝对化和编码操作,把URL存储在一个散列表或其他数据结构中,应当首选URI类。URL类主要用于从服务器下载内容。

URI类

统一资源标识符采用特定语法标识一个资源的字符串。资源是由URI标识的内容,URI是标识一个资源的字符串。

URI语法

URI的语法由一个模式和一个模式特定组成部分组成,用冒号分隔。如

模式:模式特定部分

模式包括:data,file,ftp,http,mailto,magnet,telnet,urn

模式特定部分无特定语法,很多采用层次结构形式如:

//authority/path?query

经典URI三部分分别由 ASCII 字母数字符号组成。所有其他字符,包括非 ASCII 字母数字,应当用百分号 % 转义,其后是该字符按UTF-8 编码的十六进制码。若没有将非ASCII字符编码为十六进制码,而是将它们直接包含在URI中,那得到的是IRI。

URI和URL的区别

URI是对URL的抽象。java.net.URI与java.net.URL类的区别:

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

一句话,URL对象是对应网络获取的应用层协议的一个表示,而URI对象纯粹用于解析和处理字符串。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值