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,
int port, String path, String query, String fragment)


          根据给定的组成部分构造一个分层 URI。
URI(String scheme, String host, String path, String fragment)

          根据给定的组成部分构造分层 URI。
URI(String scheme, String authority,
String path, String query, String fragment)


          根据给定的组成部分构造分层 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,
int port, String file)

          根据指定
protocolhostport 号和 file
创建 URL 对象。
URL(String protocol, String host,
int port, String file, URLStreamHandler handler)


          根据指定的 protocolhostport
号、filehandler 创建 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
 void
set(String protocol, String host,
int port, String file, String ref)

          设置 URL
的字段。
protected
 void
set(String protocol, String host,
int port, String authority, String userInfo, String path, String query, String ref)


          设置 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的更多相关文章

  1. Java网络编程之URLConnection

    Java网络编程之URLConnecton 一.URLConnection简介 URLConnection是一个抽象类,表示指向URL指定资源的活动连接.URLConnection有两个不同但相关的用 ...

  2. Java网络编程之InetAddress浅析

    Java网络编程之InetAddress浅析 一.InetAddress综述 IP地址是IP使用的32位(IPv4)或者128位(IPv6)位无符号数字,它是传输层协议TCP,UDP的基础.InetA ...

  3. Java网络编程之TCP、UDP

    Java网络编程之TCP.UDP 2014-11-25 15:23 513人阅读 评论(0) 收藏 举报 分类: java基础及多线程(28) 版权声明:本文为博主原创文章,未经博主允许不得转载.   ...

  4. Java网络编程之UDP

    Java网络编程之UDP 一.C/S架构中UDP网络通信流程 ①创建DatagramSocket与DatagramPacket对象 ②建立发送端,接收端 ③建立数据包 ④调用Socket的发送.接收方 ...

  5. Java网络编程之TCP

    Java网络编程之TCP ​ TCP主要需要两个类:Socket和ServerSocket,Socket是客户端连接服务器时创建,参数需要指定服务器的ip和端口,ServerSocket是服务器端创建 ...

  6. java网络编程之TCP通讯

    java中的网络编程之TCP协议的详细介绍,以及如何使用,同时我在下面举2例说明如何搭配IO流进行操作, /* *TCP *建立连接,形成传输数据的通道: *在连接中进行大数据量传输: *通过三次握手 ...

  7. Java高级编程之URL处理

    Java URL处理 URL(Uniform Resource Locator)中文名为统一资源定位符,有时也被俗称为网页地址.表示为互联网上的资源,如网页或者FTP地址. 本章节我们将介绍Java是 ...

  8. Java网络编程之InetAddress和URL

    在Java中提供了专门的网络开发程序包---java.net,java的网络编程提供了两种通信协议:TCP(传输控制协议)和UDP(数据报协议). 一.IP(Internet Protocol) 与I ...

  9. 3.Java网络编程之IP

    前面两篇博文我们已经简单了解了IP.端口.协议以及两种参考模型,我们现在重新从程序角度来看下这个参考模型. 如果我们从事的是Web网站开发,那么我们应该知道HTML是一种超文本标记语言 (Hyper ...

随机推荐

  1. 《C# 语言学习笔记》——委托

    委托是一种可以把引用存储为函数的类型. 委托的声明非常类似于函数,但不带函数体,且要使用delegate关键字.委托的声明制定了一个返回类型和一个参数列表. 在定义了委托后,就可以声明该委托类型的变量 ...

  2. @GetMapping、@PostMapping和@RequestMapping的区别

    @GetMapping 用于将Http Get 请求映射到特定处理程序方法的注释.具体来说就是:@GetMapping是一个作为快捷方式的组合注释 @RequestMapping(method = R ...

  3. Flink 灵魂两百问,这谁顶得住?

    Flink 学习 https://github.com/zhisheng17/flink-learning 麻烦路过的各位亲给这个项目点个 star,太不易了,写了这么多,算是对我坚持下来的一种鼓励吧 ...

  4. 微信小程序 「柒留言」 — 实现微信公众号留言功能(限时免费入驻,建议收藏)

    「柒留言」小程序留言助手使用指南(接近原生界面) 前言 从去年 3 月以后新公众号就没得留言功能了,新申请的微信公众号没有留言功能,没有留言就无法跟读者进行互动,写出去的文章得不到反馈,着实感觉有蛮难 ...

  5. Linux下zookeeper下载与安装教程

    原文连接:(http://www.studyshare.cn/blog-front//blog/details/1169/0)一.下载 官网下载:点这里  百度网盘下载:点这里 官网下载图示: jav ...

  6. Currency Exchange POJ1860

    Description Several currency exchange points are working in our city. Let us suppose that each point ...

  7. 夯实Java基础(二)——面向对象之封装

    1.封装介绍 封装封装,见名知意,就是把东西包装隐藏起来,不被外界所看见, 而Java特性封装:是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数 ...

  8. Django中自定义admin---Xadmin的实现

    在Django框架中,自带一个后台管理页面admin,这个管理页面很全,但是,有些并不是我们需要的,所以我们可以根据admin的实现流程来自定义自己的需求,即根据admin的实现方式来实现自定制--X ...

  9. 基于opencv,开发摄像头播放程序

    前言 Windows下实现摄像视频捕捉有多种实现方式:各种方式的优劣,本文不做对比.但是,opencv是一款老牌开发库,在图像处理领域声名显赫.采用opencv来处理摄像视频,在性能和稳定性上,是有保 ...

  10. android——实现跨程序访问数据

    使用之前的SQLite存储的应用程序.首先需要在这个应用程序中创建内容提供器,右击com.example.administrator.exp7包→New→Other→Content Provider, ...