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. 小白学python-day03-系统位数、变量、用户输入、if else

    今天是day03,以下是学习总结. 但行努力,莫问前程. ----------------------------------------------------------------------- ...

  2. jsp数据交互(一).3

    引入的文件如果是jsp则应定义为***.jspf文件,如果其他文件可定义为***.inc文件,即include file. jsp:include是既可以静态包含又可以动态包含,用jsp:includ ...

  3. TestNG中DataProvider的用法一

    目录 为什么要使用DataProvider DataProvider的常规用法 带Method参数的DataProvider 带ITestContext的DataProvider DataProvid ...

  4. 【Spring】org.springframework.web.context.ContextLoaderListen 报错

    详细信息如下: org.apache.catalina.core.StandardContext.listenerStart Error configuring application listene ...

  5. 【iOS】NSString rangeOfString

    今天遇到了 NSString 的 rangeOfString 方法,刚遇到的时候不知道什么作用, 网上找到了一篇文章,介绍得挺简洁,代码如下: NSString *str1 = @"can ...

  6. win10应用商店卸载后重装教程

    方法一 先进这个链接   http://go.microsoft.com/fwlink/?LinkId=619547  下载一个记事本文件,并且把它保存到你的“下载” 里面. 管理员身份打开Power ...

  7. 什么是redis的缓存雪崩与缓存穿透

    今天来分享一下Redis几道常见的面试题: 如何解决缓存雪崩? 如何解决缓存穿透? 如何保证缓存与数据库双写时一致的问题? 一.缓存雪崩 1.1 什么是缓存雪崩? 首先我们先来回答一下我们为什么要用缓 ...

  8. Spring 源码学习(一)-容器的基础结构

    关注公众号,大家可以在公众号后台回复“博客园”,免费获得作者 Java 知识体系/面试必看资料 展示的代码摘取了一些核心方法,去掉一些默认设置和日志输出,还有大多数错误异常也去掉了,小伙伴想看详细代码 ...

  9. Spring的数据库编程浅入浅出——不吹牛逼不装逼

    Spring的数据库编程浅入浅出——不吹牛逼不装逼 前言 上文书我写了Spring的核心部分控制反转和依赖注入,后来又衔接了注解,在这后面本来是应该写Spring AOP的,但我觉得对于初学者来说,这 ...

  10. JAVA基础知识(四):final关键字

    final关键字可以用于成员变量.本地变量.方法以及类. 2. final成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误. 3. 你不能够对final变量再次赋值. 4. 本地 ...