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, 根据给定的组成部分构造一个分层 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。 |
代码示例
@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, 根据指定 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 。 |
代码示例
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的更多相关文章
- Java网络编程之URLConnection
Java网络编程之URLConnecton 一.URLConnection简介 URLConnection是一个抽象类,表示指向URL指定资源的活动连接.URLConnection有两个不同但相关的用 ...
- Java网络编程之InetAddress浅析
Java网络编程之InetAddress浅析 一.InetAddress综述 IP地址是IP使用的32位(IPv4)或者128位(IPv6)位无符号数字,它是传输层协议TCP,UDP的基础.InetA ...
- Java网络编程之TCP、UDP
Java网络编程之TCP.UDP 2014-11-25 15:23 513人阅读 评论(0) 收藏 举报 分类: java基础及多线程(28) 版权声明:本文为博主原创文章,未经博主允许不得转载. ...
- Java网络编程之UDP
Java网络编程之UDP 一.C/S架构中UDP网络通信流程 ①创建DatagramSocket与DatagramPacket对象 ②建立发送端,接收端 ③建立数据包 ④调用Socket的发送.接收方 ...
- Java网络编程之TCP
Java网络编程之TCP TCP主要需要两个类:Socket和ServerSocket,Socket是客户端连接服务器时创建,参数需要指定服务器的ip和端口,ServerSocket是服务器端创建 ...
- java网络编程之TCP通讯
java中的网络编程之TCP协议的详细介绍,以及如何使用,同时我在下面举2例说明如何搭配IO流进行操作, /* *TCP *建立连接,形成传输数据的通道: *在连接中进行大数据量传输: *通过三次握手 ...
- Java高级编程之URL处理
Java URL处理 URL(Uniform Resource Locator)中文名为统一资源定位符,有时也被俗称为网页地址.表示为互联网上的资源,如网页或者FTP地址. 本章节我们将介绍Java是 ...
- Java网络编程之InetAddress和URL
在Java中提供了专门的网络开发程序包---java.net,java的网络编程提供了两种通信协议:TCP(传输控制协议)和UDP(数据报协议). 一.IP(Internet Protocol) 与I ...
- 3.Java网络编程之IP
前面两篇博文我们已经简单了解了IP.端口.协议以及两种参考模型,我们现在重新从程序角度来看下这个参考模型. 如果我们从事的是Web网站开发,那么我们应该知道HTML是一种超文本标记语言 (Hyper ...
随机推荐
- 原创:用node.js搭建本地服务模拟接口访问实现数据模拟
前端开发中,数据模拟是必要的,这样就能等后台接口写完,我们直接把接口请求的url地址从本地数据模拟url换成后台真实地址就完成项目了.传参之类的都不用动. 之前网上找了很多类似于mock等感觉都不太实 ...
- 【iOS】UIImage 等比率缩放
这两天处理引导页面的时候遇到了图片略大的问题,上网查找后找到了解决方法.用的是 UIImage 的等比率缩放,虽然不难,但之前没接触过,故记之. 代码如下: - (UIImage *)scaleIma ...
- 机房ping监控 smokeping+prometheus+grafana(续) 自动获取各省省会可用IP
一.前言 1.之前的文章中介绍了如何使用smokeping监控全国各省的网络情况:https://www.cnblogs.com/MrVolleyball/p/10062231.html 2.由于之前 ...
- 【Python-Django后端】用户注册通用逻辑,用户名、手机号重名检测,注册成功后状态保持!!!
用户注册后端逻辑 1. 接收参数 username = request.POST.get('username') password = request.POST.get('password') pas ...
- JavaScript数据结构——字典和散列表的实现
在前一篇文章中,我们介绍了如何在JavaScript中实现集合.字典和集合的主要区别就在于,集合中数据是以[值,值]的形式保存的,我们只关心值本身:而在字典和散列表中数据是以[键,值]的形式保存的,键 ...
- 10.Go-goroutine,waitgroup,互斥锁和channel
10.1.goroutine goroutine的使用 //Learn_Go/main.go package main import ( "fmt" "time" ...
- [原创实践]redhat linux 5.3搭建Nexus
1:下载安装JDK,配置好环境变量(JAVA_HOME等) 下载linux下64位的jdk-7u45-linux-x64.tar.gz(百度网盘下载,官网的jdk-7u51-linux-x64.tar ...
- android ——Intent
Intent是android程序中各组件之间进行交互的重要方式,它可以用于指明当前组件想要执行的动作,也可以在不同组件之间传递数据,Intent一般被用于启动活动,启动服务以及发送广播. 一.显式的使 ...
- Android Pie 私人 DNS 使用教程
本文首发于:微信公众号「运维之美」,公众号 ID:Hi-Linux. 「运维之美」是一个有情怀.有态度,专注于 Linux 运维相关技术文章分享的公众号.公众号致力于为广大运维工作者分享各类技术文章 ...
- AutoCAD二次开发(.Net)之创建图层Layer
//https://blog.csdn.net/qq_21489689?t=1[CommandMethod("CREATELY")] public void CreateLayer ...