本文主要是介绍读书笔记-java网络编程-5URL和URI-URL类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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类主要用于从服务器下载内容。
这篇关于读书笔记-java网络编程-5URL和URI-URL类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!