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. zabbix3.4用Python脚本Excel批量导入主机

    1.安装xlrd读取Excel文件 1.1. 下载setuptools-38.2.4.zip,上传至zabbix服务器解压安装,下载地址:https://pypi.python.org/package ...

  2. 名称空间(name space)

    名称空间(name space) 函数编程中,有一个挥之不去的问题:变量名的定义. 我们知道,在相同的作用域内不能出现两个相同的变量名,否则前者被后者覆盖 我们还知道,局部变量的名字可以与全局变量的名 ...

  3. Jenkins持续部署-创建差量更新包

    目录 Jenkins持续部署-创建差量更新包 目录 前言 目的 详细流程 生成版本号 获取版本号 创建文件更新清单 压缩 获取上个版本的包 创建差量更新包 读取服务器Json配置 远程创建文件夹目录 ...

  4. husky+ prettier + commitlint 提交前代码检查和提交信息规范

    一.安装相关的包 npm install -D husky npm install -D lint-staged // lint钩子 npm install -D prettiernpm instal ...

  5. BFS(宽度优先搜索) -例题

    原题地址 https://vjudge.net/contest/313171     密码:algorithm A - Rescue Angel was caught by the MOLIGPY! ...

  6. 使用f12定位bug

    为什么找到网站中的bug后还要去分析它到底是属于前端bug还是后端bug 三个原因: 1.在一些公司,一个系统可能是由前端团队和后端团队共同开发出来的,因此在分配bug的时候,不同模块的bug一般都会 ...

  7. .net持续集成测试篇之Nunit参数化测试

    系列目录 在进行单元测试的时候,很多时候,很多时候我们都是在单元测试方法内部提供特定的值,但是这样测试往往造成样本数不足从而导致覆盖的结果不够全面,很多时候我们更想提供来自外部的,满足条件的一组值来进 ...

  8. 【精选】Markdown 语法汇总

    博客园也能Markdown?美滋滋,Markdown真的是好用QAQ. 本文档按照Markdown各种常用语法类别,以文字描述+演示的方式来展现markdown语法的使用.Markdown 的目标是实 ...

  9. 1、JAVA的小白之路

    大学的时光过得很快,转眼我已经大二了,在大一时,学习了C\C++,对于语言有一定基础,在未来的道路上,我需要攒足干劲,积累足够的知识和技能,去走上社会. 我的第一任大学班主任告诉我:“作为程序员,你至 ...

  10. JVM总结(三)

    JVM总结(3)Class文件,类加载机制.编译过程 Java编译器先把Java代码编译为存储字节码的Class文件,再通过Class文件进行类加载. Class类文件的结构 Java编译器可以把Ja ...