有一个非常重要的类,而我对它知之甚少,它就是:java.net.URL 。在各个框架都能看到它的身影。我平时也经常用到,但是没有重视,理解不够。
URL是什么,格式什么样子?参考维基百科:https://zh.wikipedia.org/wiki...
本文主要是将java.net.URL及相关的几个类的注释进行记录和说明。
记录和说明的目的是方便自己的查阅。
1. java.net.URL
/**
* 类URL表示统一资源定位符,指向万维网上的“资源”的指针。
* 资源可以是文件或目录这样简单的东西,也可以是对更复杂的对象的引用,例如对数据库或搜索引擎的查询。
* 有关URL类型及其格式的更多信息,请访问: [Types of URL](http://web.archive.org/web/20051219043731/http://archive.ncsa.uiuc.edu/SDG/Software/Mosaic/Demo/url-primer.html)
* 通常,URL可以分为几个部分。 请考虑以下示例:
* http://www.example.com/docs/resource1.html
* 上面的URL表示要使用的协议是http (超文本传输协议),并且该信息驻留在名为www.example.com的主机上。
* 该主机上的信息名为/docs/resource1.html 主机上此名称的确切含义是依赖于协议和依赖于主机。 “信息”通常驻留在文件中,也可以在运行中生成。
* URL可以选择指定“端口”,该端口是在远程主机上进行TCP连接的端口号。 如果未指定端口,则使用协议的默认端口。 例如, http的默认端口为80 。 备用端口可以指定为: http://www.example.com:1080/docs/resource1.html
* ...
*/
public final class URL implements java.io.Serializable {
transient URLStreamHandler handler;
/**
* 返回一个URLConnection实例,这个实例代表URL引用的远端对象的一个连接。
* 每当URL协议对应的handler调用openConnection(URL)一个新的URLConnection会被创建
* 应该注意,一个URLConnection的实例不会在创建的时候建立真正的网络连接。
* 创建真实的网络连接发生在URLConnection.connect()调用。
* 如果对于handler的协议,存在一个公共的、专门的URLConnection子类属于以下包之一或其子包之一:java.lang \ java.io\ java.util\java.net,返回的这个连接将会是这个子类。例如:
*对于HTTP 协议,一个HttpURLConnection 会被返回,JAR协议的话则JarURLConnection 会被返回。
* /
public URLConnection openConnection() throws java.io.IOException {
return handler.openConnection(this);
}
public final InputStream openStream() throws java.io.IOException {
return openConnection().getInputStream();
}
}
2.URLConnection
**/**
* 抽象类 URLConnection 是表示应用程序和 URL 之间的通信链接的所有类的超类。这个类的一个实例可以被用来读或写被这个URL引用的资源。
* 通常,创建一个URL的连接是多重步骤的过程:
* openConnection() -> connect()
* 1、当在一个URL对象调用openConnection,coonnection 对象被创建
* 2、设置参数和一般请求属性被操纵。
* 3、使用 connect 方法建立与远程对象的实际连接。
* 4、远端对象变为可用。远端对象的头信息、字段和内容可以被获取。
* 设置参数可以通过以下方法被修改:
* setAllowUserInteraction
* setDoInput
* setDoOutput
* setIfModifiedSince
* setUseCaches
* 可以使用以下方法修改通用请求属性:
* setRequestProperty
* AllowUserInteraction 和UseCaches 参数的默认值可以通过setDefaultAllowUserInteraction和setDefaultUseCaches 来设置。
* 以上每一个set方法有一个对应的get方法来获取参数或一般请求属性的值。
* 以下方法在和远端通信对象创建后用来获取头、字段和内容:
* getContent
* getHeaderField
* getInputStream
* getOutputStream
* 一些特定的头字段被经出获取,包括:
* getContentEncoding
* getContentLength
* getContentType
* getDate
* getExpiration
* getLastModifed
* 提供了方便的获取这些字段的方法。
* getContentType方法被getContent方法用来判断远程对象的类型;子类可能会发现重写 getContentType 方法很方便。
* 在常见情况下,可以忽略所有预连接参数和一般请求属性:预连接参数和请求属性默认为合理值。
* 对于这个接口的大多数客户端来说,只有两个有趣的方法:getInputStream 和 getContent,它们通过便利方法镜像到 URL 类中。
* 调用close()的方法InputStream或OutputStream一个的URLConnection的请求后,可能释放与此实例相关联的网络资源,除非特定的协议规范为其指定不同的行为。
*/
public abstract class URLConnection {
}**
3. URLStreamHandler
/**
* 此抽象类是所有流协议处理管理类的通用父类。一个流协议的handler知道怎么去为一个特定协议创建一个连接,比如:http https
*大多数情况,URLStreamHandler 子类的实例是不会被应用直接创建的。相反,当构造一个URL的时候,第一次协议的被遇到,恰当的流协议handler 被自动加载。
*/
public abstract class URLStreamHandler {
/**
* 为被URL参数引用的对象打开一个连接,这个方法应该被子类重写。
*如果对于handler的协议,存在一个公共的、专门的URLConnection子类属于以下包之一或其子包之一:java.lang \ java.io\ java.util\java.net,返回的这个连接将会是这个子类。例如:
*对于HTTP 协议,一个HttpURLConnection 会被返回,JAR协议的话则JarURLConnection 会被返回。
*/
abstract protected URLConnection openConnection(URL u) throws IOException;
}
java 的注释写的非常棒,通过注释我们就大致了解了URL资源在java 中如何读写,了解了在java如何实现自定义的一中URL的协议的读写,比如JAR协议,可以去看一下怎么通过jar加载class 及相关内容的。
相关文章
暂无评论...