首先,URI是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源。而URL是uniform resource locator,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。
一句话解释:URI 和 URL 都定义了 what the resource is。URL 还定义了 how to get the resource。

1.java.net.URL

Java设计者没有把URL作为一个字符串,而是单独使用了一个类,好处是:这个类可以单独设置 协议,主机名,端口,查询字符串。
URL是不可变的,构造后字段不再改变,这样可以保证他们是“线程安全”的。

构造URL的主要方式:

//1.直接构造
 URL url1 = new URL("http://www.baidu.com");
 //2.使用协议,主机名,(端口,)文件
 URL url2 = new URL("http", "blog.csdn.net", 80, "/u011179993");
 URL url3 = new URL("http", "blog.csdn.net", "/u011179993");

 //其他省略...

当构造不符合规范时(比如协议不支持),会抛出MalformedURLException,注意:第二种方式的文件前面要加“/”


从URL获取数据

使用openStream()
最基本的是openStream(),他会返回一个输入流,可以读取数据。
实例:

URL url3 = new URL("http://ilogo.imobile.com.cn/detail-logo_id-692341.html");
InputStream inputStream = url3.openStream();

InputStreamReader reader = new InputStreamReader(inputStream, "UTF-8");
//从这个流中获取数据
char[] c = new char[1024];
int flag;
while ((flag = reader.read(c)) > 0) {
    System.out.println(new String(c));
}

inputStream .close();

openConnection()
openConnection()可以返回一个URLConnection对象,使用它进行更多控制,并可以返回输入流。

获取url各个部分**

在 ‘http://jack:1234@www.aaa.com:8080/index.html?num=1&time=12#love’ 中:
http是协议 ,jack:1234@www.aaa.com是授权信息,jack:1234是用户信息,8080是端口号,/index.html?num=1&time=12是文件,num=1&time=12是查询字符串,love是片段。

URL类提供了几个方法获取它的各个部分:
getProtocol() 获取协议
getPath() 获取文件(不包含查询字符串)
getFile() 获取文件(包含查询字符串)
getHost() 获取主机名
getPort() 获取端口号
getRef() 获取片段
getQuery() 获取查询字符串
getUserInfo() 获取用户信息
getAuthority() 获取授权信息

实例↓

URL url = new URL("ftp://jack:1234@www.aaa.com:8080/index.html?num=1&time=12#love");

System.out.println(url.getProtocol());
System.out.println(url.getPath());
System.out.println(url.getFile());
System.out.println(url.getHost());
System.out.println(url.getPort());
System.out.println(url.getRef());
System.out.println(url.getQuery());
System.out.println(url.getUserInfo());
System.out.println(url.getAuthority());

输出为↓

ftp
/index.html
/index.html?num=1&time=12
www.aaa.com
8080
love
num=1&time=12
jack:1234
jack:1234@www.aaa.com:8080


2.URI

如果你想用URL完成标识,而不是获取资源(例如表示一个XML的命名空间),那么请使用URI。他们二者可以通过toURI() toURL()转化。

构造URI

与URL不同,URI支持任意协议,只要语法正确就行。

待补充…//todo

3.x-www-form-urlencoded

由于操作系统之间的差异性和历史原因,URL中使用的字符必须来自于ASCII的一个特定子集:
A到Z a到z 0到9 - _ . ! ~ * ' , ( )
除了这些,其他要进行编码,为 %加上两个十六进制数字,空格编码为%20或+,+编码为%2B。
/ # =& ? 用在名字当中应该编码,但作为分隔符不用编码。
java提供了URLEncode类和URLDecoder类来进行编码和解码。

URLEncode类

注意:
1.与编码规范不同,URLEncode类会对 ~ ’ ! ( ) 进行编码。不过不用担心,现代浏览器会合理处理这些“过度编码”的URL。
2.URLEncode类会盲目地对 / # & 等字符进行编码,二不去判断他们出现的位置。

String a=URLEncoder.encode("UTF-8");
System.out.println(a);

输出↓

http%3A%2F%2Fwww.csdn.net

URLDecode类

URLDecode类可以对已经编码的字符串进行解码。

4.代理

待补充