URL and URI

Uniform Resource Identifier (URI) − 对任何抽象或物理资源进行完整标识的字符序列。

Resource Locator (URL) − 除了标识资源可用的位置之外,URI的一个子集描述了访问该资源的主要机制。

所以,URL是URI的子集

所有URI,不管其是否为URL,需遵循形式:scheme:[//authority][/path][?query][#fragment]

scheme − 对于 URL, 是访问资源的协议名称;对其他URI,是分配标识符的规范的名称
authority − 可选的组成用户授权信息部分,主机及端口(可选)
path − 用于在scheme和authority内标识资源
query − 与路径一起的附加数据用于标识资源。对于url是查询字符串
fragment − 资源特定部分的可选标识

为了方便地识别特定的URI是否是URL,我们可以检查它的scheme。每个URL都必须从以下scheme开始:ftp、http、https、gopher、mailto、news、nntp、telnet、wais、file或prospero。如果不是以此开头,则不是URL。

URI组件:

该类是不可变类(Instances of this class are immutable),提供了用于从其组成部分或通过解析其字符串形式创建 URI 实例的构造方法、用于访问实例的各个不同组成部分的方法,以及用于对 URI 实例进行规范化、解析和相对化的方法。
在java的uri类中,将URI字符串分为绝对RUI和相对URI,或者不透明URI(opaque uri)和分层URI(hierarchical uri)。其中,不透明 URI 为绝对 URI,且不透明的URI无法解析,例如:mailto:java-net@java.sun.com   、news:comp.lang.java、urn:isbn:096139210x,而分层URI即可以为绝对URI,也可以是相对URI,例如http://java.sun.com/j2se/1.3/ 是绝对URI,而../../../demo/jfc/SwingSet2/src/SwingSet2.java是相对URI。
常用方法:
URI normalize()    //规范化此URI的路径。(规范化: 将分层 URI 的路径组成部分中的不必要的 "." 和 ".." 部分移除的过程。每个 "." 部分都将被移除。".." 部分也被移除,除非它前面有一个非 ".." 部分。规范化对不透明 URI 不产生任何效果。)
URI relativize(URI uri)    //根据此 URI 将给定 URI 相对化。
URI parseServerAuthority()    //尝试将此 URI 的授权组成部分(如果已定义)解析为用户信息、主机和端口组成部分。
URI resolve(URI uri)    //根据此 URI 解析给定的 URI。
URI resolve(String str)    //解析给定的字符串,然后在此 URI 的基础上构造一个新的 URI。 此方法与进行 resolve(URI.create(str)) 的作用相同。
URL组件:
提供了解析URL的功能,可以将URL解析成一个结构化的数据,并提供了简单的查找主机和打开到指定资源的连接之类的网络 I/O 操作。
示例:
URL url = new URL("http://www.baidu.com");
//打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream。
InputStream in = url.openStream();// 其内部也调用了openConnection()
ByteArrayOutputStream output = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
// 读取内容不含响应头
while ((len = in.read(buffer)) != -1)
{
   output.write(buffer, 0, len);
}
System.err.println(new String(output.toByteArray()));
原文地址:https://www.cnblogs.com/djh222/p/10550874.html