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课堂整理16---内置函数

    1. abs :求绝对值 print(abs(-1)) 2. all()传入一个可迭代对象,对该对象进行bool值运算,若都为True 就返回True,有一个为假,就返回False print(all ...

  2. java练习---14

    abstract class A{ private String name; public A(String name) { this.name = name; } public String get ...

  3. 【Unity游戏开发】不接SDK也能在游戏内拉起加QQ群操作?

    一.引子 一般在游戏进行对外测试的时候都会有一个玩家QQ群,方便玩家反馈问题.交流游戏心得等.那么为了增加玩家加QQ群的欲望,可能会在游戏里面设计一个小功能,点击一下可以直接拉起手Q加群的操作,加了Q ...

  4. Shell基本语法---常见的条件判断

    语法 [ 判断表达式 ] 文件夹或路径是否存在 -e 目标是否存在(exist) -d 是否为路径(directory) -f 是否为文件(file) [ -e text.sh ] || touch ...

  5. 目标检测评价指标mAP 精准率和召回率

    首先明确几个概念,精确率,召回率,准确率 精确率precision 召回率recall 准确率accuracy 以一个实际例子入手,假设我们有100个肿瘤病人. 95个良性肿瘤病人,5个恶性肿瘤病人. ...

  6. maven添加oracle驱动包

    问题描述 项目用到了oracle,但由于oracle商业版权问题,maven在中心资源库直接下载jar包是要收费的 解决方法 第一步: 下载ojdbc6.jar 第二步: 将下载的jar放入项目的li ...

  7. Maven安装和配置环境变量

    Maven配置 1.下载 下载maven 3.5.4 先到官网http://maven.apache.org/download.cgi 下载最新版本(目前是3.5.4 ),下载完成后,解压到某个目录( ...

  8. 代码生成java连接数据库的所需代码(超详细)

    开始学习: round 1:(一开始学习当然还是要一步一步学习的啦,哪有什么一步登天!!!) a.准备工作:1.eclipse,mysql(这两个软件肯定要的啦,不然学什么把它们连接起来) 2.加载驱 ...

  9. PPT | Docker定义存储-让应用无痛运行

    编者注: 本文为9月27日晚上8点有容云平台存储架构师张朝潞在腾讯课堂中演讲的PPT,本次课堂为有容云主办的线上直播Docker Live时代●Online Meetup-第三期:Docker定义存储 ...

  10. Java匹马行天下之J2EE框架开发——Spring—>Spring框架知多少

    ————也许我注定成不了一个伟大的人,但是至少我可以做一个很棒的自己.我想我现在应该做的不是瞻前顾后,而是活在当下,正确认知自己,做好自己现在的工作,努力提升自己的能力,踏踏实实地做一个程序员 一.思 ...