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,
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。

  代码示例

 1 @Test  
 2 public void uriTest() throws Exception{  
 3         URI uri = new URI("https://www.qiandu.com:8080/goods/index.html?username=dgh&passwd=123#j2se");  
 4         System.out.println("scheme             : " + uri.getScheme());  
 5         System.out.println("SchemeSpecificPart : " + uri.getSchemeSpecificPart());  
 6         System.out.println("Authority          : " + uri.getAuthority());  
 7         System.out.println("host               : " + uri.getHost());  
 8         System.out.println("port               : " + uri.getPort());  
 9         System.out.println("path               : " + uri.getPath());  
10         System.out.println("query              : "  + uri.getQuery());  
11         System.out.println("fragment           : " + uri.getFragment());  
12 }  

四、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

  代码示例

 1 package me.net.url;
 2 
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.net.URL;
 6 import java.net.URLConnection;
 7 
 8 /**
 9  * URL:统一资源定位符
10  * 
11  * @author Administrator
12  *
13  */
14 public class TestURL {
15 
16     public static void main(String[] args) throws IOException {
17     URL url = new URL("https://www.baidu.com");
18     // System.out.println(url.getProtocol());
19     // System.out.println(url.getFile());
20     // System.out.println(url.getPort());
21     // System.out.println(url.getAuthority());
22     // System.out.println(url.getRef());
23     // System.out.println(url.getQuery());
24     // System.out.println(url.getContent());
25     // System.out.println(url.getPath());
26     // System.out.println(url.getHost());
27     // System.out.println(url.getDefaultPort());
28     // System.out.println(url.getUserInfo());
29 
30     InputStream is = url.openStream();
31     byte[] b = new byte[1024];
32     int readLen = 0;
33     while ((readLen = is.read(b)) != -1) {
34         System.out.print(new String(b, 0, readLen));
35     }
36 
37     /**
38      * 如果希望既有数据输入,又有数据输出,考虑URLConnection URLConnection urlConn =
39      * url.openConnection(); 
40      * urlConn.getInputStream();
41      * urlConn.getOutputStream();
42      */
43 
44     }
45 }

View Code

 参考文章:

  https://danielmiessler.com/study/url-uri/

  http://blog.csdn.net/readiay/article/details/52862379

  https://www.cnblogs.com/chengdabelief/p/6635045.html

如果,您对我的这篇博文有什么疑问,欢迎评论区留言,大家互相讨论学习。
如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】。
如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】。
如果,您对我的博文感兴趣,可以关注我的后续博客,我是【AlbertRui】。

转载请注明出处和链接地址,欢迎转载,谢谢!

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注