您的位置:首页 > 理论基础 > 计算机网络

读书笔记-java网络编程-5URL和URI-URL类

2016-07-04 23:02 567 查看

2. URL类

java.net.URL类是对url的抽象,是一个final类。URL类不可变,构造一个URL对象后,其字段不在改变,因此它是线程安全的。使用了策略设计模式。

2.1 创建新的URL

public URL(String url) throws MalformedURLException
public URL(String protocol, String hostname, String file) throws MalformedURLException
public URL(String protocol, String host, int port, String file) throws MalformedURLException
public URL(URL base,String relative) throws MalformedURLException


支持协议

所有虚拟机都支持:http、file

java支持:https、jar、ftp

一部分虚拟机:mailto、gopher,定制协议:doc、netdoc、systemresouce和java内部使用的verbatim

如果某个虚拟机不支持你需要的协议:

可以为该模式安装一个协议处理器

更建议的做法是为该协议定制一个API

除了验证能否识别URL模式外,java不会对它构造的URL完成任何正确性检查。而需要程序员去确认。

2.1.1 从字符串构造URL

public URL(String url) throws MalformedURLException


2.1.2 由组成部分构造URL

public URL(String protocol, String hostname, String file) throws MalformedURLException


这里将端口设为-1,所以会使用该协议的默认端口。

file参数应该以斜线开头,包括路径、文件名和可选的片段标识符。

2.1.3 构造相对URL

public URL(URL base,String relative) throws MalformedURLException


2.1.4 其他URL对象来源

在applet中,getDocumentBase()会返回包含这个applet的页面的URLgetCodeBase()会返回applet.class文件的URL。

java.io.File类有一个toURL方法,返回与指定文件匹配的fileURL。

类加载器中。ClassLoader.getSystemResource(String name )返回一个URL,ClassLoader.getSystemResources(String name )返回一个URL列表。实例方法getResource(String name )会在所引用类加载器使用的路径中搜索指定资源的URL。

2.2 从URL获取数据

InputStream openStream()


在客户端和服务器之间完成必要的握手,返回一个InputStream,可以由此读取数据。

注意是使用释放模式或者带资源的try来确保Stream使用后关闭。

从这个Stream读取的数据是原始内容,如果原始内容是ascii码就是ascii码,如果是HTML就是HTML。

因此这里有一个比较麻烦的问题是如何确定读取原始内容的类型,当然有时还可以通meta数据读取。但是未必每次都能成功。有时候可以openConnection方法返回URLconnection对象来读取。

public URLConnection openConnection()


为指定的URL打开一个socket,并返回一个URLConnection对象。URLConnection表示一个网络资源的打开的连接。

如果希望与服务器直接通信,应该使用这个方法。通URLConnection,你可以访问服务器发送的所有数据。除了原始的文档,还可以访问协议指定的元数据。

这个方法还有一个重载版本

public URLConnection openConnection(Proxy proxy)


这会覆盖用平常的socksProxyHost、socksProxyPort、http.proxyHost、http.proxyPort、http.nonProxyHosts和类似的属性设置的任何代理服务器。

如果协议处理器不支持代理,这个参数将被忽略,如果可能将直接建立连接

public final Object getContent()


是下载URL引用数据的第三种方法。getContent()方法获取由URL引用的数据,尝试由它建立某种类型的对象。通常来说使用Object 来获取引用,然后用instanceof检测类型。通常来说需要猜测获得的类型。

2.3 分解URL

URL的每个部分都有对应的get方法。

http://www.ibiblio.org/javafaq/books/jnp/index.html?isbn=15623534#tocc


模式:http

授权机构:www.ibiblio.org

路径:/javafaq/books/jnp/index.html

片段标识符:tocc

查询字符串:isbn=15623534

http://admin@www.blackstar.com:8080/


授权机构:admin@www.blackstar.com:8080/

用户信息:admin

主机:www.blackstar.com

端口:8080

2.4 相等性和比较

当且仅当,URL指向相同的主机端口号和路径上的相同子元素,而且有相同的片段标识符和查询字符串时,才认为相等。

但是这样说了URL上的equals可能是一个阻塞的IO操作.出于这个原因,应该避免将URL存储在一来equals的数据结构中,如java.utl.HashMap。更好的选择是java.net.URI。可以在必要时将URI与URL来回转换

但是另一方面,equals还不够深入。不会具体的比较两个URL标识的资源。也没有实现Comparable接口。

还有一个sameFile方法类似于equals。但是这个方法不会考虑片段标识符

2.5 比较

toString
toExternalForm


toString总是将转换成绝对URL,toExternalForm也类似

toURI


这里需要说明一下URI的好处。URI 提供了更精确、更符合规范的行为。

对于绝对化和编码,在选择时应当首选URI类。

如果需要把URL存储在散列表或者其他数据结构中,也应该首选URI类,因为它的equals不会阻塞。

URL类主要用于从服务器下载内容。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息