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, 根据给定的组成部分构造一个分层 URI。 |
|
URI(String scheme, String host, String path, String fragment) 根据给定的组成部分构造分层 URI。 |
|
URI(String scheme, String authority, 根据给定的组成部分构造分层 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, 根据指定 protocol 、host 、port 号和 file 创建 URL 对象。 |
|
URL(String protocol, String host, 根据指定的 protocol 、host 、port 号、 file 和 handler 创建 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 |
set(String protocol, String host, 设置 URL 的字段。 |
protected |
set(String protocol, String host, 设置 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】。转载请注明出处和链接地址,欢迎转载,谢谢!