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

来源:互联网 发布:淘宝diy耳机哪家好 编辑:程序博客网 时间:2024/05/22 15:43

2. URL类

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

2.1 创建新的URL

public URL(String url) throws MalformedURLExceptionpublic URL(String protocol, String hostname, String file) throws MalformedURLExceptionpublic URL(String protocol, String host, int port, String file) throws MalformedURLExceptionpublic 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对象来源

  1. 在applet中,getDocumentBase()会返回包含这个applet的页面的URLgetCodeBase()会返回applet.class文件的URL。
  2. java.io.File类有一个toURL方法,返回与指定文件匹配的fileURL。
  3. 类加载器中。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 比较

toStringtoExternalForm

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

toURI

这里需要说明一下URI的好处。URI 提供了更精确、更符合规范的行为。
对于绝对化和编码,在选择时应当首选URI类。
如果需要把URL存储在散列表或者其他数据结构中,也应该首选URI类,因为它的equals不会阻塞。
URL类主要用于从服务器下载内容。

1 0
原创粉丝点击