Java网络编程之URL和URI
Java网络编程之URL与URI
一、URL与URI简介
URI = Universal Resource Identifier 统一资源标志符
URL = Universal Resource Locator 统一资源定位符
URN = Universal Resource Name 统一资源名称
这三者的关系如下图:

也就是说,URI分为三种,URL or URN or (URL and URI)
URL代表资源的路径地址,而URN代表资源的名称。
URL是一个URI,除了标识一个资源,还会为资源提供一个特定的网络位置,客户端可以用它来获取这个资源的一个标识。与之不同的是,通用的URI可以告诉你一个资源是什么,但是无法告诉你它在哪里,以及如何得到这个资源。在实际世界中,这就像书名《哈利波特与死亡圣器》与这本书在图书馆中的具体位置“312室第28行第七个书架”之间的区别。在Java中,这就类似于java.net.URI类(只标识资源)与java.net.URL类(既能标识资源,又能获取资源)之间的差别。
通过URL找到资源是对网络位置进行标识,如:
http://example.org/absolute/URI/with/absolute/path/to/resource.txt
ftp://example.org/resource.txt
通过URN找到资源是通过对名称进行标识,这个名称在某命名空间中,并不代表网络地址,如:
urn:issn:1535-3613
二、URL的语法
URL与URI很像,两者的格式几乎差不多,但是我们接触的还是URL比较多,就以URL为例说明
URL提供了一种访问定位因特网上任意资源的手段,但是这些资源可以通过不同的方法(例如HTTP、FTP、SMTP)来访问,不管怎样,他都基本上由9个部分构成:
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<fragment>
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就可以 快速定位到某一段。
三、java.net.URI简介:
URI数据结构

可见URI实现了Serializable,其对象实例可序列化,实现了Comparable接口,其对象实例是可比较的
方法摘要
| 构造方法摘要 | |
|---|---|
URI(String str) 通过解析给定的字符串构造一个 URI。 |
|
URI(String scheme, String ssp, String fragment)根据给定的组成部分构造 URI。 |
|
URI(String scheme, String userInfo, String host,根据给定的组成部分构造一个分层 URI。 |
|
URI(String scheme, String host, String path, String fragment)根据给定的组成部分构造分层 URI。 |
|
URI(String scheme, String authority,根据给定的组成部分构造分层 URI。 |
|
| 方法摘要 | |
|---|---|
int |
compareTo(URI that)将此 URI 与另一个对象(也必须是 URI)进行比较。 |
static URI |
create(String str)通过解析给定的字符串创建 URI。 |
boolean |
equals(Object ob)测试此 URI 与另一对象的相等性。 |
String |
getAuthority()返回此 URI 的已解码的授权组成部分。 |
String |
getFragment()返回此 URI 的已解码的片段组成部分。 |
String |
getHost()返回此 URI 的主机组成部分。 |
String |
getPath()返回此 URI 的已解码的路径组成部分。 |
int |
getPort()返回此 URI 的端口号。 |
String |
getQuery()返回此 URI 的已解码的查询组成部分。 |
String |
getRawAuthority()返回此 URI 的原始授权组成部分。 |
String |
getRawFragment()返回此 URI 的原始片段组成部分。 |
String |
getRawPath()返回此 URI 的原始路径组成部分。 |
String |
getRawQuery()返回此 URI 的原始查询组成部分。 |
String |
getRawSchemeSpecificPart()返回此 URI 原始的、特定于方案的部分。 |
String |
getRawUserInfo()返回此 URI 的原始用户信息组成部分。 |
String |
getScheme()返回此 URI 的方案组成部分。 |
String |
getSchemeSpecificPart()返回此 URI 的特定于方案的解码部分。 |
String |
getUserInfo()返回此 URI 的已解码的用户信息组成部分。 |
int |
hashCode()返回此 URI 的哈希码值。 |
boolean |
isAbsolute()判断此 URI 是否为绝对的。 |
boolean |
isOpaque()判断此 URI 是否为不透明的。 |
URI |
normalize()规范化此 URI 的路径。 |
URI |
parseServerAuthority()尝试将此 URI 的授权组成部分(如果已定义)解析为用户信息、主机和端口组成部分。 |
URI |
relativize(URI uri)根据此 URI 将给定 URI 相对化。 |
URI |
resolve(String str)解析给定的字符串,然后在此 URI 的基础上构造一个新的 URI。 |
URI |
resolve(URI uri)根据此 URI 解析给定的 URI。 |
String |
toASCIIString()以 US-ASCII 字符串形式返回此 URI 的内容。 |
String |
toString()以字符串形式返回此 URI 的内容。 |
URL |
toURL()根据此 URI 构造一个 URL。 |
代码示例
@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());
}
四、java.net.URL简介
URL数据结构

可见URL实现了Serializable接口,URL实例可以序列化
URL方法摘要
| 构造方法摘要 | |
|---|---|
URL(String spec) 根据 String 表示形式创建 URL 对象。 |
|
URL(String protocol, String host, 根据指定 protocol、host、port 号和 file创建 URL 对象。 |
|
URL(String protocol, String host,根据指定的 protocol、host、port号、 file 和 handler 创建 URL 对象。 |
|
URL(String protocol, String host, String file)根据指定的 protocol 名称、host 名称和file 名称创建 URL。 |
|
URL(URL context, String spec)通过在指定的上下文中对给定的 spec 进行解析创建 URL。 |
|
URL(URL context, String spec, URLStreamHandler handler)通过在指定的上下文中用指定的处理程序对给定的 spec 进行解析来创建 URL。 |
|
| 方法摘要 | |
|---|---|
boolean |
equals(Object obj)比较此 URL 是否等于另一个对象。 |
String |
getAuthority()获取此 URL 的授权部分。 |
Object |
getContent()获取此 URL 的内容。 |
Object |
getContent(Class[] classes) 获取此 URL 的内容。 |
int |
getDefaultPort()获取与此 URL 关联协议的默认端口号。 |
String |
getFile()获取此 URL 的文件名。 |
String |
getHost()获取此 URL 的主机名(如果适用)。 |
String |
getPath()获取此 URL 的路径部分。 |
int |
getPort()获取此 URL 的端口号。 |
String |
getProtocol()获取此 URL 的协议名称。 |
String |
getQuery()获取此 URL 的查询部分。 |
String |
getRef()获取此 URL 的锚点(也称为“引用”)。 |
String |
getUserInfo()获取此 URL 的 userInfo 部分。 |
int |
hashCode()创建一个适合哈希表索引的整数。 |
URLConnection |
openConnection()返回一个 URLConnection 对象,它表示到 URL所引用的远程对象的连接。 |
URLConnection |
openConnection(Proxy proxy)与 openConnection() 类似,所不同是连接通过指定的代理建立;不支持代理方式的协议处理程序将忽略该代理参数并建立正常的连接。 |
InputStream |
openStream()打开到此 URL 的连接并返回一个用于从该连接读入的InputStream。 |
boolean |
sameFile(URL other)比较两个 URL,不包括片段部分。 |
protected |
set(String protocol, String host, 设置 URL 的字段。 |
protected |
set(String protocol, String host,设置 URL 的指定的 8 个字段。 |
static void |
setURLStreamHandlerFactory(URLStreamHandlerFactory fac)设置应用程序的 URLStreamHandlerFactory。 |
String |
toExternalForm()构造此 URL 的字符串表示形式。 |
String |
toString()构造此 URL 的字符串表示形式。 |
URI |
toURI()返回与此 URL 等效的 URI。 |
代码示例
package me.net.url; import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection; /**
* URL:统一资源定位符
*
* @author Administrator
*
*/
public class TestURL { public static void main(String[] args) throws IOException {
URL url = new URL("https://www.baidu.com");
// System.out.println(url.getProtocol());
// System.out.println(url.getFile());
// System.out.println(url.getPort());
// System.out.println(url.getAuthority());
// System.out.println(url.getRef());
// System.out.println(url.getQuery());
// System.out.println(url.getContent());
// System.out.println(url.getPath());
// System.out.println(url.getHost());
// System.out.println(url.getDefaultPort());
// System.out.println(url.getUserInfo()); InputStream is = url.openStream();
byte[] b = new byte[1024];
int readLen = 0;
while ((readLen = is.read(b)) != -1) {
System.out.print(new String(b, 0, readLen));
} /**
* 如果希望既有数据输入,又有数据输出,考虑URLConnection URLConnection urlConn =
* url.openConnection();
* urlConn.getInputStream();
* urlConn.getOutputStream();
*/ }
}
参考文章:
https://danielmiessler.com/study/url-uri/
http://blog.csdn.net/readiay/article/details/52862379
https://www.cnblogs.com/chengdabelief/p/6635045.html
如果,您对我的这篇博文有什么疑问,欢迎评论区留言,大家互相讨论学习。
如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】。
如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】。
如果,您对我的博文感兴趣,可以关注我的后续博客,我是【AlbertRui】。转载请注明出处和链接地址,欢迎转载,谢谢!
Java网络编程之URL和URI的更多相关文章
- Java网络编程之URLConnection
Java网络编程之URLConnecton 一.URLConnection简介 URLConnection是一个抽象类,表示指向URL指定资源的活动连接.URLConnection有两个不同但相关的用 ...
- Java网络编程之InetAddress浅析
Java网络编程之InetAddress浅析 一.InetAddress综述 IP地址是IP使用的32位(IPv4)或者128位(IPv6)位无符号数字,它是传输层协议TCP,UDP的基础.InetA ...
- Java网络编程之TCP、UDP
Java网络编程之TCP.UDP 2014-11-25 15:23 513人阅读 评论(0) 收藏 举报 分类: java基础及多线程(28) 版权声明:本文为博主原创文章,未经博主允许不得转载. ...
- Java网络编程之UDP
Java网络编程之UDP 一.C/S架构中UDP网络通信流程 ①创建DatagramSocket与DatagramPacket对象 ②建立发送端,接收端 ③建立数据包 ④调用Socket的发送.接收方 ...
- Java网络编程之TCP
Java网络编程之TCP TCP主要需要两个类:Socket和ServerSocket,Socket是客户端连接服务器时创建,参数需要指定服务器的ip和端口,ServerSocket是服务器端创建 ...
- java网络编程之TCP通讯
java中的网络编程之TCP协议的详细介绍,以及如何使用,同时我在下面举2例说明如何搭配IO流进行操作, /* *TCP *建立连接,形成传输数据的通道: *在连接中进行大数据量传输: *通过三次握手 ...
- Java高级编程之URL处理
Java URL处理 URL(Uniform Resource Locator)中文名为统一资源定位符,有时也被俗称为网页地址.表示为互联网上的资源,如网页或者FTP地址. 本章节我们将介绍Java是 ...
- Java网络编程之InetAddress和URL
在Java中提供了专门的网络开发程序包---java.net,java的网络编程提供了两种通信协议:TCP(传输控制协议)和UDP(数据报协议). 一.IP(Internet Protocol) 与I ...
- 3.Java网络编程之IP
前面两篇博文我们已经简单了解了IP.端口.协议以及两种参考模型,我们现在重新从程序角度来看下这个参考模型. 如果我们从事的是Web网站开发,那么我们应该知道HTML是一种超文本标记语言 (Hyper ...
随机推荐
- Linux卸载MySql——ubuntu版
卸载mysql 1)删除mysql的数据文件 sudo rm /var/lib/mysql/ -R 2)删除mqsql的配置文件 sudo rm /etc/mysql/ -R 3)自动卸载mysql的 ...
- Java EE.JSP.动作组件
常见的JSP动作组件有以下几种: 1)<jsp:include>:在页面被请求的时候引入一个文件 2)<jsp:param>:在动作组件中引入参数信息 3)<jsp:fo ...
- Spring + RocketMQ使用
本文所介绍环境为win7环境下运行, 从官方github中(https://github.com/alibaba/RocketMQ)下载RocketMQ-master.zip,版本为v3.5.8,解压 ...
- Golang高效实践之interface、reflection、json实践
前言 反射是程序校验自己数据结构和类型的一种机制.文章尝试解释Golang的反射机制工作原理,每种编程语言的反射模型都是不同的,有很多语言甚至都不支持反射. Interface 在将反射之前需要先介绍 ...
- 装饰器和"开放-封闭"原则
装饰器和"开放-封闭"原则 "开放-封闭"原则 软件开发中的"开放-封闭"原则,它规定已经实现的功能代码不应该被修改,但可以被扩展,即: 封 ...
- Thinkphp5.0快速入门笔记(1)
学习来源与说明 https://www.kancloud.cn/thinkphp/thinkphp5_quickstart 测试与部署均在windows10下进行学习. Composer安装和更新 C ...
- hexo的环境变量被删除怎么办
这篇文章主要讲在path这一环境变量被删除的情况下,补上哪些环境变量才可以使hexo重新使用. 前两天配置opencv的时候,不小心将环境变量中"path"这一项中的内容给覆盖掉了 ...
- Go slice:切片的“陷阱”和本质
文章说明 总结了go语言中切片slice的特殊性和使用时的注意事项. 个人理解,不足之处欢迎指出. slice:切片,是go语言中一种常用的数据结构,基于数组构建,表示相同数据类型的集合. 数组 Go ...
- Chrome谷歌浏览器实用插件
总结整理了一下个人平时常用的谷歌浏览器插件 Adblock Plus 广告拦截 uBlock Origin Chrono 下载管理器 Tampermonkey 油猴子(各种强大的脚本,强烈推荐) F ...
- 重启iis的命令是什么?三种简单的重启方式
第一种.界面操作 打开“控制面板”->“管理工具”->“服务”.找到“IIS Admin Service” 右键点击“重新启动” 弹出 “停止其它服务” 窗口,点击“是”. 第二种.Net ...