3 URI/URL
3.1 概念
3.1.1 URI和URL概念
URL(Uniform Resource Locator):统一资源定位符,它表示Internet上某一资源的地址。
通过URL我们可以访问Internet上的各种网络资源,比如最常见的www,ftp站点。浏览器通过解析给定的URL可以在网络上查找相应的文件或其他资源。
URI=URL+URN
-
URI:Uniform Resource Identifier ,统一资源标志符。
-
URL:Uniform Resource Locator,统一资源定位符。
-
URN:Uniform Resource Name,统一资源命名。
网络三大基石:HTML,HTTP,URL
3.1.2格式
URL的基本结构由5部分组成:
<传输协议>://<主机名>:<端口号>/<文件名>#片段名?参数列表
片段名:即锚点,例如看小说,直接定位到章节 参数列表格式:参数名=参数值&参数名=参数值...... 例如: http://localhost:8080/index.jsp#a?username=Tom&password=123456
3.2 URI
URI是一个final修饰的类,它的实例创建包含4个构造方法以及一个静态方法create。
static void testuri(){ try { String uu = "https://blog.csdn.net/allenfoxxxxx/article/details/90707505"; System.out.println(uu); URI uri1 = new URI(uu); URI uri2 = URI.create(uu); System.out.println(" uri1、uri2相等时返回0--"+uri1.compareTo(uri2)); //查看其他构造方法所涉及的参数信息 System.out.println(String.format(" scheme:%s \n ssp:%s \n fragment:%s \n userInfo:%s \n host:%s \n port:%s \n path:%s \n query:%s \n authority:%s\n\n", uri1.getScheme(), uri1.getSchemeSpecificPart(), uri1.getFragment(), uri1.getUserInfo(), uri1.getHost(), uri1.getPort(), uri1.getPath(), uri1.getQuery(), uri1.getAuthority() )); } catch (URISyntaxException e) { e.printStackTrace(); } }
URI 构造方法 | |
---|---|
URI(String str) | 通过解析给定的字符串构造一个URI。 |
URI(String scheme, String ssp, String fragment) | 从给定的组件构造一个URI。 |
URI(String scheme, String userInfo, String host, int port, String path, String query, String fragment) | 从给定的组件构造一个分层URI。 |
URI(String scheme, String host, String path, String fragment) | 从给定的组件构造一个分层URI。 |
URI(String scheme, String authority, String path, String query, String fragment) | 从给定的组件构造一个分层URI。 |
URI 所有方法 | |
---|---|
static URI create(String str) | 通过解析给定的字符串创建一个URI。 |
int compareTo(URI that) | 将此URI与另一个对象进行比较,该对象必须是URI。 |
boolean equals(Object ob) | 测试此URI以与另一个对象相等。 |
String getAuthority() | 返回此URI的已解码权限组件。 |
String getFragment() | 返回此URI的解码片段组件。 |
String getHost() | 返回此URI的主机组件。 |
String getPath() | 返回此URI的解码路径组件。 |
int getPort() | 返回此URI的端口号。 |
String getQuery() | 返回此URI的解码查询组件。 |
String getRawAuthority() | 返回此URI的原始权限组件。 |
String getRawFragment() | 返回此URI的原始片段组件。 |
String getRawPath() | 返回此URI的原始路径组件。 |
String getRawQuery() | 返回此URI的原始查询组件。 |
String getRawSchemeSpecificPart() | 返回此URI的原始方案特定部分。 |
String getRawUserInfo() | 返回此URI的原始用户信息组件。 |
String getScheme() | 返回此URI的方案组件。 |
String getSchemeSpecificPart() | 返回此URI的解码方案特定部分。 |
String getUserInfo() | 返回此URI的解码的用户信息组件。 |
int hashCode() | 返回此URI的哈希码值。 |
boolean isAbsolute() | 告诉这个URI是否是绝对的。 |
boolean isOpaque() | 告知这个URI是否不透明。 |
URI normalize() | 规范此URI的路径。 |
URI parseServerAuthority() | 尝试将此URI的权限组件(如果已定义)解析为用户信息,主机和端口组件。 |
URI relativize(URI uri) | 相对于此URI的给定URI。 |
URI resolve(String str) | 通过解析给定的字符串构造一个新的URI,然后根据此URI进行解析。 |
URI resolve(URI uri) | 根据此URI解析给定的URI。 |
String toASCIIString() | 将此URI的内容作为US-ASCII字符串返回。 |
String toString() | 以字符串形式返回此URI的内容。 |
URL toURL() | 从此URI构造一个URL。 |
3.3 URL
URL是一个final修饰的类。
其中:
-
静态方法
setURLStreamHandlerFactory
设置应用程序的 URLStreamHandlerFactory(工厂类),相关类是URLStreamHandler
-
方法
openStream
提供了创建读取url指定资源的方法 -
方法
openConnection
,相关类是URLConnection
static void testurl(){ try { String uu = "https://blog.csdn.net/allenfoxxxxx/article/details/90707505"; System.out.println(uu); URL url = new URL(uu); InputStream inputStream = url.openStream(); int il = 1024; byte[] bytes = new byte[il]; int n=5; //输出部分内容 while (n-->0){ inputStream.read(bytes,0,il-1); System.out.println(new String(bytes)); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
URL 构造方法 | |
---|---|
URL(String spec) | 从 String表示形成一个 URL对象。 |
URL(String protocol, String host, int port, String file) | 创建 URL从指定对象 protocol , host , port数,和 file 。 |
URL(String protocol, String host, int port, String file, URLStreamHandler handler) | 创建 URL从指定对象 protocol , host , port数, file和 handler 。 |
URL(String protocol, String host, String file) | 从指定的 protocol名称, host名称和 file名称创建一个URL。 |
URL(URL context, String spec) | 通过在指定的上下文中解析给定的规范来创建一个URL。 |
URL(URL context, String spec, URLStreamHandler handler) | 通过在指定上下文中使用指定的处理程序解析给定规范来创建URL。 |
URL 所有方法 | |
---|---|
static void setURLStreamHandlerFactory(URLStreamHandlerFactory fac) | 设置应用程序的 URLStreamHandlerFactory 。 |
URLConnection openConnection() | 返回一个URLConnection实例,表示与URL引用的远程对象的URL 。 |
URLConnection openConnection(Proxy proxy) | 与openConnection()相同,但连接将通过指定的代理进行; 不支持代理的协议处理程序将忽略代理参数并进行正常连接。 |
InputStream openStream() | 打开与此 URL ,并返回一个 InputStream ,以便从该连接读取。 |
URI toURI() | 返回相当于此URL的URI 。 |
boolean equals(Object obj) | 将此URL与其他对象进行比较。 |
String getAuthority() | 获取此的授权部分 URL 。 |
Object getContent() | 获取此URL的内容。 |
Object getContent(Class[] classes) | 获取此URL的内容。 |
int getDefaultPort() | 获取与此 URL的协议的默认端口号。 |
String getFile() | 获取此 URL的文件名。 |
String getHost() | 获取此 URL的主机名(如适用)。 |
String getPath() | 获取此 URL的路径部分。 |
int getPort() | 获取此 URL的端口号。 |
String getProtocol() | 获取此 URL的协议名称。 |
String getQuery() | 获取此 URL的查询部分。 |
String getRef() | 获取此的锚定(也称为“参考”) URL 。 |
String getUserInfo() | 获取该 URL的userInfo部分。 |
int hashCode() | 创建适合哈希表索引的整数。 |
boolean sameFile(URL other) | 比较两个URL,不包括片段组件。 |
String toExternalForm() | 构造这个 URL的字符串 URL 。 |
String toString() | 构造此 URL的字符串表示 URL 。 |
3.4 Connection 连接对象
URLConnection及其子类HttpURLConnection、JarURLConnection都是抽象类,其实例都是通过特定URL调用openConnection方法创建连接对象返回。
3.4.1 URLConnection
URLConnection是一个抽象类,是表示应用程序和URL之间的通信链接的所有类的超类。其子接子类包含HttpURLConnection和JarURLConnection。
URLCONNECTION 构造方法 | |
---|---|
URLConnection(URL url) | 构造与指定URL的URL连接。 |
URLCONNECTION 所有方法 | |
---|---|
protected boolean allowUserInteraction | 如果 true ,则在上下文中检查该 URL ,其中允许用户交互(例如弹出认证对话)是有意义的。 |
protected boolean connected | 如果 false ,此连接对象尚未创建指定URL的通信链接。 |
protected boolean doInput | 该变量由 setDoInput方法设置。 |
protected boolean doOutput | 该变量由 setDoOutput方法设置。 |
protected long ifModifiedSince | 某些协议支持跳过对象的提取,除非对象在某个时间以前已被更新。 |
protected URL url | URL表示打开此连接的万维网上的远程对象。 |
protected boolean useCaches | 如果 true ,协议允许使用缓存,只要它可以。 |
抽象类URLConnection是表示应用程序和URL之间的通信链接的所有类的超类。 该类的实例可以用于从URL引用的资源中读取和写入。 通常,创建与URL的连接是一个多步骤过程:
-
通过在URL上调用openConnection方法创建连接对象。
-
设置参数和一般请求属性被操纵。
-
使用connect方法实现与远程对象的实际连接。
-
远程对象变得可用。 可以访问头字段和远程对象的内容。
使用以下方法修改设置参数:
-
setAllowUserInteraction
-
setDoInput
-
setDoOutput
-
setIfModifiedSince
-
setUseCaches
并且使用以下方法修改一般请求属性:
-
setRequestProperty :可以使用方法setDefaultAllowUserInteraction和setDefaultUseCaches设置AllowUserInteraction和UseCaches参数的默认值。
上述set方法中的每一个都具有相应的get方法来检索参数或一般请求属性的值。 适用的具体参数和一般请求属性是特定于协议的。
使用以下方法访问头域和连接远程对象后的内容:
-
getContent
-
getHeaderField
-
getInputStream
-
getOutputStream
某些头字段经常被访问。 方法:
-
getContentEncoding
-
getContentLength
-
getContentType
-
getDate
-
getExpiration
-
getLastModifed
提供方便的访问这些领域。 getContentType方法由getContent方法用于确定远程对象的类型; 子类可能会方便地覆盖getContentType方法。
在常见情况下,所有预连接参数和一般请求属性都可以忽略:预连接参数和请求属性默认为明智的值。 对于这个界面的大多数客户端,只有两个有趣的方法: getInputStream和getContent ,它们通过方便的方法镜像在URL类中。
在请求属性和报头字段的更多信息http连接可以被发现在: http://www.ietf.org/rfc/rfc2616.txt
调用close()上方法InputStream或OutputStream一个的URLConnection的请求后,可能释放与此实例相关联的网络资源,除非特定的协议规范为其指定不同的行为。
3.4.2 HttpURLConnection
HttpURLConnection是支持HTTP特定功能的URLConnection,也是一个抽象类。
每个HttpURLConnection实例用于单个请求,但是到HTTP服务器的底层网络连接可能被其他实例透明地共享。 在请求之后,在HttpURLConnection的InputStream或OutputStream上调用close()方法可以释放与该实例关联的网络资源,但对任何共享持久连接没有影响。 调用disconnect()方法可能会关闭底层套接字,如果持久连接当时是空闲的。
HTTP协议处理程序有一些可以通过系统属性访问的设置。 这包括Proxy settings以及various other settings 。
-
安全权限
如果安装了一个安全管理器,并且如果调用了一种方法,导致尝试打开一个连接,则调用方必须拥有:
-
一个“连接” SocketPermission到主机/端口组合的目标URL或
-
一个允许这个请求的URLPermission 。
如果启用了自动重定向,并且此请求被重定向到另一目的地,则呼叫者还必须具有连接到重定向主机/ URL的权限。
HttpURLConnection定义了多个静态变量,用以表示多个HTTP状态码。
HTTPURLCONNECTION 定义的成员变量 | |
---|---|
protected int chunkLength | 使用分块编码流模式进行输出时的块长度。 |
protected int fixedContentLength | 使用固定长度流式传输模式时的固定内容长度。 |
protected long fixedContentLengthLong | 使用固定长度流式传输模式时的固定内容长度。 |
protected boolean instanceFollowRedirects | 如果 true ,协议将自动跟随重定向。 |
protected String method | HTTP方法(GET,POST,PUT等)。 |
protected int responseCode | 一个 int代表三位数的HTTP状态码。 |
protected String responseMessage | HTTP响应消息。 |
static int HTTP_ACCEPTED | HTTP状态码202:接受。 |
static int HTTP_BAD_GATEWAY | HTTP状态码502:坏网关。 |
static int HTTP_BAD_METHOD | HTTP状态代码405:不允许的方法。 |
static int HTTP_BAD_REQUEST | HTTP状态代码400:错误请求。 |
static int HTTP_CLIENT_TIMEOUT | HTTP状态码408:请求超时。 |
static int HTTP_CONFLICT | HTTP状态代码409:冲突。 |
static int HTTP_CREATED | HTTP状态代码201:创建。 |
static int HTTP_ENTITY_TOO_LARGE | HTTP状态码413:请求实体太大。 |
static int HTTP_FORBIDDEN | HTTP状态码403:禁止。 |
static int HTTP_GATEWAY_TIMEOUT | HTTP状态代码504:网关超时。 |
static int HTTP_GONE | HTTP状态代码410:没有。 |
static int HTTP_INTERNAL_ERROR | HTTP状态码500:内部服务器错误。 |
static int HTTP_LENGTH_REQUIRED | HTTP状态码411:需要长度。 |
static int HTTP_MOVED_PERM | HTTP状态代码301:永久移动。 |
static int HTTP_MOVED_TEMP | HTTP状态码302:临时重定向。 |
static int HTTP_MULT_CHOICE | HTTP状态代码300:多个选择。 |
static int HTTP_NO_CONTENT | HTTP状态代码204:无内容。 |
static int HTTP_NOT_ACCEPTABLE | HTTP状态码406:不可接受 |
static int HTTP_NOT_AUTHORITATIVE | HTTP状态码203:非授权信息。 |
static int HTTP_NOT_FOUND | HTTP状态码404:未找到。 |
static int HTTP_NOT_IMPLEMENTED | HTTP状态码501:未实现。 |
static int HTTP_NOT_MODIFIED | HTTP状态码304:未修改。 |
static int HTTP_OK | HTTP状态码200:确定。 |
static int HTTP_PARTIAL | HTTP状态码206:部分内容。 |
static int HTTP_PAYMENT_REQUIRED | HTTP状态码402:需要支付。 |
static int HTTP_PRECON_FAILED | HTTP状态码412:前提条件失败。 |
static int HTTP_PROXY_AUTH | HTTP状态码407:需要代理验证。 |
static int HTTP_REQ_TOO_LONG | HTTP状态代码414:请求URI太大。 |
static int HTTP_RESET | HTTP状态码205:重置内容。 |
static int HTTP_SEE_OTHER | HTTP状态码303:查看其他。 |
static int HTTP_SERVER_ERROR | 已弃用,它是错误的,不应该存在。 |
static int HTTP_UNAUTHORIZED | HTTP状态码401:未经授权 |
static int HTTP_UNAVAILABLE | HTTP状态码503:服务不可用。 |
static int HTTP_UNSUPPORTED_TYPE | HTTP状态码415:不支持的媒体类型。 |
static int HTTP_USE_PROXY | HTTP状态码305:使用代理。 |
static int HTTP_VERSION | HTTP状态码505:不支持HTTP版本。 |
HTTPURLCONNECTION 构造方法 | |
---|---|
protected HttpURLConnection(URL u) | HttpURLConnection的构造方法。 |
HTTPURLCONNECTION 所有方法 | |
---|---|
abstract void disconnect() | 表示在不久的将来不太可能对服务器的其他请求。 |
InputStream getErrorStream() | 如果连接失败但服务器发送有用的数据,则返回错误流。 |
static boolean getFollowRedirects() | 返回一个 boolean指示是否应自动遵循HTTP重定向(3xx)。 |
String getHeaderField(int n) | 返回的值 n th头字段。 |
long getHeaderFieldDate(String name, long Default) | 返回以日期解析的命名字段的值。 |
String getHeaderFieldKey(int n) | 返回的关键 n th头字段。 |
boolean getInstanceFollowRedirects() | 返回此 HttpURLConnection的 instanceFollowRedirects字段的值。 |
Permission getPermission() | 返回一个表示连接到目标主机和端口所需的权限的SocketPermission对象。 |
String getRequestMethod() | 获取请求方法。 |
int getResponseCode() | 从HTTP响应消息获取状态代码。 |
String getResponseMessage() | 获取与服务器的响应代码一起返回的HTTP响应消息(如果有)。 |
void setChunkedStreamingMode(int chunklen) | 当内容长度 未提前知道时,此方法用于启用HTTP请求体的流式传输,而无需内部缓冲。 |
void setFixedLengthStreamingMode(int contentLength) | 当预先知道内容长度时,此方法用于启用HTTP请求体的流式传输,而无需内部缓冲。 |
void setFixedLengthStreamingMode(long contentLength) | 当预先知道内容长度时,此方法用于启用HTTP请求体的流式传输,而无需内部缓冲。 |
static void setFollowRedirects(boolean set) | 设置HTTP重定向(具有响应代码3xx的请求)是否应该在该类之后自动跟随。 |
void setInstanceFollowRedirects(boolean followRedirects) | 设置HTTP重定向(响应代码为3xx的请求)是否应该由此 HttpURLConnection实例自动跟随。 |
void setRequestMethod(String method) | 设置URL请求的方法,其中之一是:GET POST HEAD OPTIONS PUT DELETE TRACE是符合协议限制的合法的。 |
abstract boolean usingProxy() | 指示连接正在通过代理。 |
3.4.3 JarURLConnection
JarURLConnection是与Java ARchive(JAR)文件或JAR文件中的条目的URL连接,也是抽象类。
JAR URL的语法是: jar:<url>!/{entry}
例如: jar:http://www.foo.com/bar/baz.jar!/COM/foo/Quux.class
JAR URL应用于引用JAR文件或JAR文件中的条目。 上面的示例是一个引用JAR条目的JAR URL。 如果省略条目名称,则URL引用整个JAR文件: jar:http://www.foo.com/bar/baz.jar!/
当他们知道他们创建的URL是一个JAR URL,并且他们需要JAR特定的功能时,用户应该将通用URLConnection转换为JarURLConnection。 例如:
URL url = new URL("jar:file:/home/duke/duke.jar!/");
JarURLConnection jarConnection = (JarURLConnection)url.openConnection();
Manifest manifest = jarConnection.getManifest();
JarURLConnection实例只能用于从JAR文件读取。 使用此类不可能获得OutputStream
修改或写入底层JAR文件。
例子:
-
罐子入口
jar:http://www.foo.com/bar/baz.jar!/COM/foo/Quux.class
-
一个jar文件
jar:http://www.foo.com/bar/baz.jar!/
-
一个罐子目录
jar:http://www.foo.com/bar/baz.jar!/COM/foo/
!/
被称为分离器 。
当通过构建一个JAR URL new URL(context, spec)
,适用下列规则:
-
如果没有上下文URL,并且传递给URL构造函数的规范不包含分隔符,则该URL被认为是引用JarFile。
-
如果存在上下文URL,则假定上下文URL是指JAR文件或Jar目录。
-
如果规范以'/'开始,Jar目录将被忽略,并且该规范被认为是Jar文件的根目录。
例子:
-
上下文: jar:http://www.foo.com/bar/jar.jar!/ ,spec: baz / entry.txt
url: jar:http://www.foo.com/bar/jar.jar!/baz/entry.txt
-
上下文: jar:http://www.foo.com/bar/jar.jar!/ baz ,spec: entry.txt
url: jar:http://www.foo.com/bar/jar.jar!/baz/entry.txt
-
上下文: jar:http://www.foo.com/bar/jar.jar!/ baz ,spec: /entry.txt
url: jar:http://www.foo.com/bar/jar.jar!/entry.txt
-
JARURLCONNECTION 构造方法 | |
---|---|
protected JarURLConnection(URL url) | 创建新的JarURLConnection到指定的URL。 |
JARURLCONNECTION 所有方法 | |
---|---|
Attributes getAttributes() | 如果该连接的URL指向JAR文件条目,则返回此连接的Attributes对象,否则返回null。 |
Certificate[] getCertificates() | 如果它的URL指向JAR文件条目,则返回此连接的证书对象,否则返回null。 |
String getEntryName() | 返回此连接的条目名称。 |
JarEntry getJarEntry() | 返回此连接的JAR条目对象(如果有)。 |
abstract JarFile getJarFile() | 返回此连接的JAR文件。 |
URL getJarFileURL() | 返回此连接的Jar文件的URL。 |
Attributes getMainAttributes() | 返回此连接的JAR文件的主要属性。 |
Manifest getManifest() | 返回此连接的清单,否则返回null。 |
3.4.4 简单应用
static void testConnection(){ try { System.out.println("HttpURLConnection------------------------"); //HTTP String uu = "https://blog.csdn.net/allenfoxxxxx/article/details/90707505"; System.out.println(uu); URL url = new URL(uu); HttpURLConnection connection = (HttpURLConnection)url.openConnection(); //输出响应头 System.out.println(connection.getHeaderFields()); //输出请求方式 System.out.println(connection.getRequestMethod()); //读取网页内容 InputStream inputStream = connection.getInputStream(); int il = 1024; byte[] bytes = new byte[il]; int n=1; //输出部分内容 while (n-->0){ inputStream.read(bytes,0,il-1); System.out.println(new String(bytes)); } System.out.println("\n\n\n"); System.out.println("JarURLConnection------------------------"); //JAR URL url2 = new URL("jar:file:D://ProgramData/Fun/jce.jar!/"); JarURLConnection jarConnection = (JarURLConnection)url2.openConnection(); //Manifest类用于维护清单条目名称及其相关属性。 有主要的清单属性以及每个入口属性。 Manifest manifest = jarConnection.getManifest(); //返回此清单中包含的条目的Map。 System.out.println(manifest.getEntries()); //返回清单的主要属性。 Set<Map.Entry<Object,Object>> set = manifest.getMainAttributes().entrySet(); Iterator<Map.Entry<Object,Object>> iterator = set.iterator(); Map<Object,Object> map = new HashMap<>(set.size()); while (iterator.hasNext()){ Map.Entry<Object,Object> entry = iterator.next(); //System.out.println(entry.getKey()+": "+entry.getValue()); map.put(entry.getKey(),entry.getValue()); } System.out.println(map); //将清单写入指定的OutputStream。 String ofile = "1.txt"; OutputStream outputStream = new FileOutputStream(ofile); manifest.write(outputStream ); outputStream.close(); System.out.println(System.getProperty("user.dir")+ File.separator+ofile); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
3.5 URLStreamHandler 流协议处理
抽象类 URLStreamHandler是所有流协议处理程序的通用超类。
流协议处理程序知道如何为特定协议类型建立连接,例如http或https 。
在大多数情况下, URLStreamHandler子类的实例不是由应用程序直接创建的。 更确切地说,在第一时间构建时的协议名称遇到URL ,适当的流协议处理程序被自动加载。
URLStreamHandler所提供的方法都由protected 所修饰。
URLSTREAMHANDLER 构造方法 | |
---|---|
URLStreamHandler() |
URLSTREAMHANDLER 所有方法 | |
---|---|
protected boolean equals(URL u1, URL u2) | 提供默认的equals计算。 |
protected int getDefaultPort() | 返回此处理程序解析的URL的默认端口。 |
protected InetAddress getHostAddress(URL u) | 获取我们的主机的IP地址。 |
protected int hashCode(URL u) | 提供默认散列计算。 |
protected boolean hostsEqual(URL u1, URL u2) | 比较两个URL的主机组件。 |
protected abstract URLConnection openConnection(URL u) | 打开与 URL参数引用的对象的 URL 。 |
protected URLConnection openConnection(URL u, Proxy p) | 与openConnection(URL)相同,但连接将通过指定的代理进行; 不支持代理的协议处理程序将忽略代理参数并进行正常连接。 |
protected void parseURL(URL u, String spec, int start, int limit) | 解析的字符串表示 URL成 URL对象。 |
protected boolean sameFile(URL u1, URL u2) | 比较两个URL以查看它们是否引用相同的文件,即具有相同的协议,主机,端口和路径。 |
protected void setURL(URL u, String protocol, String host, int port, String file, String ref) | 已弃用,使用setURL(URL,String,String,int,String,String,String,String); |
protected void setURL(URL u, String protocol, String host, int port, String authority, String userInfo, String path, String query, String ref) | 将 URL参数的字段设置为指示的值。 |
protected String toExternalForm(URL u) | 将 URL的特定协议转换为 String |
3.6 URLClassLoader URL类加载器
此类加载器用于从引用JAR文件和目录的URL的搜索路径加载类和资源。任何以“/”结尾的URL都假定是指一个目录。否则,URL被认为是指根据需要打开的JAR文件。
当后续加载类和资源时,将使用创建URLClassLoader实例的线程的AccessControlContext。
加载的类默认授权只能访问URLClassLoader创建时指定的URL。
URLCLASSLOADER 构造方法 | |
---|---|
URLClassLoader(URL[] urls) | 使用默认委托父级 ClassLoader为指定的URL构造一个新的 ClassLoader 。 |
URLClassLoader(URL[] urls, ClassLoader parent) | 为给定的URL构造一个新的URLClassLoader。 |
URLClassLoader(URL[] urls, ClassLoader parent, URLStreamHandlerFactory factory) | 为指定的URL,父类加载器和URLStreamHandlerFactory构造一个新的URLClassLoader。 |
URLCLASSLOADER 所有方法 | |
---|---|
protected void addURL(URL url) | 将指定的URL附加到URL列表中以搜索类和资源。 |
void close() | 关闭此URLClassLoader,以使其不能再用于加载由此加载程序定义的新类或资源。 |
protected Package definePackage(String name, Manifest man, URL url) | 在此ClassLoader中按名称定义新包。 |
protected Class<?> findClass(String name) | 从URL搜索路径查找并加载具有指定名称的类。 |
URL findResource(String name) | 在URL搜索路径上查找具有指定名称的资源。 |
Enumeration<URL> findResources(String name) | 返回表示URL搜索路径上具有指定名称的所有资源的URL的枚举。 |
protected PermissionCollection getPermissions(CodeSource codesource) | 返回给定的代码源对象的权限。 |
InputStream getResourceAsStream(String name) | 返回用于读取指定资源的输入流。 |
URL[] getURLs() | 返回加载类和资源的URL的搜索路径。 |
static URLClassLoader newInstance(URL[] urls) | 为指定的URL和默认父类加载器创建URLClassLoader的新实例。 |
static URLClassLoader newInstance(URL[] urls, ClassLoader parent) | 为指定的URL和父类加载器创建URLClassLoader的新实例。 |
3.7 URL编码解码
3.7.1 URLEncoder
HTML表单编码的实用类。 此类包含将String转换为application/x-www-form-urlencoded MIME格式的静态方法。 有关HTML表单编码的更多信息,请参阅HTML specification 。 编码字符串时,适用以下规则:
-
“ a ”至“ z ”,“ A ”至“ Z ”和“ 0 ”至“ 9 ”保持不变。
-
特殊字符“ . ”,“ - ”,“ * ”和“ _ ”保持不变。
-
空格字符“”被转换为加号“ + ”。
-
所有其他字符都不安全,并且首先使用一些编码方案将其转换为一个或多个字节。 然后每个字节由3个字符串“ %xy ”表示,其中xy是字节的两位十六进制表示。 推荐使用的编码方案是UTF-8。 但是,出于兼容性原因,如果未指定编码,则使用平台的默认编码。
例如,使用UTF-8作为编码方案,字符串“Ã@ foo-bar”将被转换为“The + string +%C3%BC%40foo-bar”,因为在UTF-8中,字符¼被编码为2字节C3(十六进制)和BC(十六进制),字符@被编码为一个字节40(十六进制)。
URLENCODER 所有方法 | |
---|---|
static String encode(String s) | 已弃用,结果字符串可能会因平台的默认编码而异。 而是使用encode(String,String)方法来指定编码。 |
static String encode(String s, String enc) | 使用特定的编码方案将字符串转换为 application/x-www-form-urlencoded格式。 |
3.7.2 URLDecoder
HTML表单解码的实用类。 该类包含用于从application/x-www-form-urlencoded MIME格式解码字符串的静态方法。 转换过程与URLEncoder类使用的转换过程相反。 假设编码字符串中的所有字符都是以下之一:“ a ”至“ z ”,“ A ”至“ Z ”,“ 0 ”至“ 9 ”和“ - ”,“ _ ”,“ . “和” * “。 字符“ % ”被允许,但被解释为特殊转义序列的开始。
在转换中应用以下规则:
-
“ a ”至“ z ”,“ A ”至“ Z ”和“ 0 ”至“ 9 ”保持不变。
-
特殊字符“ . ”,“ - ”,“ * ”和“ _ ”保持不变。
-
加号“ + ”被转换为空格字符“”。
-
格式“ %xy ”的序列将被视为表示一个字节,其中xy是8位的两位十六进制表示。 然后,连续包含这些字节序列中的一个或多个的所有子字符串将被编码将导致这些连续字节的字符替换。 可以指定用于解码这些字符的编码方案,或者如果未指定,则将使用平台的默认编码。
这种解码器可以处理非法字符串的两种可能方式。 它可以单独留下非法字符,也可以抛出一个IllegalArgumentException 。 解码器采用的方法是实现。
URLDECODER 所有方法 | |
---|---|
static String decode(String s) | 已弃用,结果字符串可能会因平台的默认编码而异。 而是使用decode(String,String)方法来指定编码。 |
static String decode(String s, String enc) | 使用特定的编码方案解码 application/x-www-form-urlencoded字符串。 |
3.7.3 IDN
提供在正常Unicode表示和ASCII兼容编码(ACE)表示之间转换国际化域名(IDN)的方法。国际化的域名可以使用整个Unicode范围内的字符,而传统的域名仅限于ASCII字符。ACE是仅使用ASCII字符的Unicode字符串的编码,可以与仅了解传统域名的软件(如域名系统)一起使用。
国际化域名定义在RFC 3490中 。 RFC 3490定义了两个操作:ToASCII和ToUnicode。 这两个操作采用Nameprep算法,即Stringprep和Punycode算法来转换域名字符串的算法。
上述转换过程的行为可以通过各种标志进行调整:
-
如果使用ALLOW_UNASSIGNED标志,则要转换的域名字符串可以包含Unicode 3.2中未分配的代码点,这是以IDN转换为基础的Unicode版本。 如果不使用标志,则将这种未分配的代码点的存在视为错误。
-
如果使用USE_STD3_ASCII_RULES标志, 则会根据RFC 1122和RFC 1123检查ASCII字符串。 如果不符合要求,这是一个错误。
这些标志可以在逻辑上进行OR。
安全考虑在国际化域名支持方面很重要。 例如,英文域名可能被重新分类 - 恶意拼写错误地替换非拉丁字母。 Unicode Technical Report #36讨论了IDN支持的安全问题以及可能的解决方案。 应用程序负责在使用国际域名时采取足够的安全措施。
IDN 所有成员 | |
---|---|
static int ALLOW_UNASSIGNED | 标志允许处理未分配的代码点 |
static int USE_STD3_ASCII_RULES | 标志打开对STD-3 ASCII规则的检查 |
static String toASCII(String input) | 从Unicode转换字符串为ASCII兼容性编码(ACE),通过的ToASCII操作中的定义 RFC 3490 。 |
static String toASCII(String input, int flag) | 从Unicode转换字符串为ASCII兼容性编码(ACE),通过的ToASCII操作中的定义 RFC 3490 。 |
static String toUnicode(String input) | 转换来自ASCII兼容性编码(ACE)为Unicode字符串,通过的ToUnicode操作中所定义的 RFC 3490 。 |
static String toUnicode(String input, int flag) | 转换来自ASCII兼容性编码(ACE)为Unicode字符串,通过的ToUnicode操作中所定义的 RFC 3490 |
3.7.4 简单应用
static void testcoding(){ String text1 = "12345DD一二三@@@@###/////\\__%%"; System.out.println("原本字符串: "+text1); String text2 = URLEncoder.encode(text1); System.out.println("URLEncoder: "+text2); String text3 = URLDecoder.decode(text2); System.out.println("URLEncoder: "+text3); String text4 = IDN.toASCII(text1); System.out.println("IDN.toASCII: "+text4); String text5 = IDN.toUnicode(text4); System.out.println("IDN.toUnicode: "+text5); }