首先,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.代理
待补充