URL 代表统一资源定位符,它表示万维网上的一种资源,比如一个网页或者 FTP 目录。
本节展示了如何编写 Java 程序来与 URL 进行通信。URL 可以分解成不同的部分,如下所示:
protocol://host:port/path?query
其中 protocol
包括 HTTP、HTTPS、FTP 和 File 等。path
有时也称为文件名,而 host
也被叫做权威。
以下是一个使用 HTTP 协议的网页 URL 的例子:
https://www.amrood.com/index.htm?language=en
注意,此 URL 并未指定端口,在这种情况下,默认使用该协议的端口。对于 HTTP 而言,默认端口为 80。
构造函数
java.net.URL
类表示一个 URL,并包含了一整套用来操作 Java 中的 URL 的方法。
URL
类包含几个用于创建 URL 的构造函数,其中包括以下几种:
-
public URL(String protocol, String host, int port, String file)
抛出 MalformedURLException
使用给定的部分创建一个 URL。
-
public URL(String protocol, String host, String file)
抛出 MalformedURLException
与前一个构造函数相同,只是使用给定协议的默认端口。
-
public URL(String url)
抛出 MalformedURLException
使用给定的字符串创建一个 URL。
-
public URL(URL context, String url)
抛出 MalformedURLException
通过解析 URL 和字符串参数创建一个 URL。
URL
类包含了多种用于访问所表示的 URL 的各个部分的方法。以下是一些 URL
类中的方法:
-
public equals(Object obj)
此方法比较此 URL 是否与另一个对象相等。
-
public String getAuthority()
返回 URL 的权威部分。
-
public Object getContent()
返回此 URL 的内容。
-
public Object getContent(Class<?>[] classes)
返回此 URL 的内容。
-
public int getDefaultPort()
返回 URL 协议的默认端口。
-
public String getFile()
返回 URL 的文件名部分。
-
public String getHost()
返回 URL 的主机部分。
-
public String getPath()
返回 URL 的路径部分。
-
public int getPort()
返回 URL 的端口部分。
-
public String getProtocol()
返回 URL 的协议部分。
-
public String getQuery()
返回 URL 的查询部分。
-
public String getRef()
返回 URL 的引用部分。
-
public String getUserInfo()
返回 URL 的 userInfo 部分。
-
public int hashCode()
创建并返回一个适合作为哈希表索引的整数。
-
public URLConnection openConnection()
返回一个代表连接到由 URL 指定的远程对象的 URLConnection
实例。
-
public URLConnection openConnection(Proxy proxy)
作用与 openConnection()
相同,不同之处在于连接将通过指定的代理进行;不支持代理的协议处理程序会忽略代理参数并建立正常连接。
-
public InputStream openStream()
打开与此 URL 的连接并返回一个用于从此连接读取的 InputStream
。
-
public boolean sameFile(URL other)
比较两个 URL,排除片段组件。
-
public static void setURLStreamHandlerFactory(URLStreamHandlerFactory fac)
设置应用程序的 URLStreamHandlerFactory
。
-
public String toExternalForm()
构建并返回此 URL 的字符串表示形式。
-
public String toString()
构建并返回此 URL 的字符串表示形式。
-
public String toURI()
返回与此 URL 等效的 URI
。
示例
下面的 URLDemo
程序展示了 URL 的各个组成部分。在命令行输入一个 URL,URLDemo
程序会输出给定 URL 的每一部分。
import java.io.IOException;
import java.net.URL;
public class URLDemo {
public static void main(String [] args) {
try {
URL url = new URL("https://www.tutorialspoint.com/index.htm?language=en#j2se");
System.out.println("URL is " + url.toString());
System.out.println("protocol is " + url.getProtocol());
System.out.println("authority is " + url.getAuthority());
System.out.println("file name is " + url.getFile());
System.out.println("host is " + url.getHost());
System.out.println("path is " + url.getPath());
System.out.println("port is " + url.getPort());
System.out.println("default port is " + url.getDefaultPort());
System.out.println("query is " + url.getQuery());
System.out.println("ref is " + url.getRef());
} catch (IOException e) {
e.printStackTrace();
}
}
}
此程序的一个样本运行结果如下:
输出
URL is https://www.tutorialspoint.com/index.htm?language=en
protocol is https
authority is www.tutorialspoint.com
file name is /index.htm?language=en
host is www.tutorialspoint.com
path is /index.htm
port is -1
default port is 443
query is language=en
ref is j2se
URLConnection 类的方法
openConnection()
方法返回一个 java.net.URLConnection
对象,这是一个抽象类,它的子类代表各种类型的 URL 连接。
例如:
-
如果你连接的是一个协议为 HTTP 的 URL,openConnection()
方法将返回一个 HttpURLConnection
对象。
-
如果你连接的是一个代表 JAR 文件的 URL,openConnection()
方法将返回一个 JarURLConnection
对象等等。
URLConnection 类的方法
URLConnection
类有许多方法用于设置或确定连接的信息,包括但不限于以下方法:
方法列表
-
void addRequestProperty(String key, String value)
添加由键值对指定的一般请求属性。
-
boolean getAllowUserInteraction()
返回此对象的 allowUserInteraction
字段的值。
-
int getConnectTimeout()
返回连接超时设置。
-
Object getContent()
获取此 URL
连接的内容。
-
Object getContent(Class[] classes)
获取此 URL
连接的内容。
-
String getContentEncoding()
返回 content-encoding
头字段的值。
-
int getContentLength()
返回 content-length
头字段的值。
-
long getContentLengthLong()
以 long
类型返回 content-length
头字段的值。
-
String getContentType()
返回 content-type
头字段的值。
-
long getDate()
返回 date
头字段的值。
-
static boolean getDefaultAllowUserInteraction()
返回 allowUserInteraction
字段的默认值。
-
boolean getDefaultUseCaches()
返回 URLConnection
的 useCaches
标志的默认值。
-
static boolean getDefaultUseCaches(String protocol)
返回给定协议的 useCaches
标志的默认值。
-
boolean getDoInput()
返回此 URLConnection
的 doInput
标志的值。
-
boolean getDoOutput()
返回此 URLConnection
的 doOutput
标志的值。
-
long getExpiration()
返回 expires
头字段的值。
-
static FileNameMap getFileNameMap()
从数据文件加载文件名映射(mimetype)。
-
String getHeaderField(int n)
返回第 n
个头字段的值。
-
String getHeaderField(String name)
返回命名头字段的值。
-
long getHeaderFieldDate(String name, long Default)
返回作为日期解析的命名字段的值。
-
int getHeaderFieldInt(String name, int Default)
返回作为数字解析的命名字段的值。
-
String getHeaderFieldKey(int n)
返回第 n
个头字段的键。
-
long getHeaderFieldLong(String name, long Default)
返回作为数字解析的命名字段的值。
-
Map<String,List<String>> getHeaderFields()
返回头字段的不可修改的映射。
-
long getIfModifiedSince()
返回此对象的 ifModifiedSince
字段的值。
-
InputStream getInputStream()
返回一个从这个打开的连接中读取的输入流。
-
int getLastModified()
返回 last-modified
头字段的值。
-
OutputStream getOutputStream()
返回一个写入此连接的输出流。
-
Permission getPermission()
返回一个权限对象,表示进行此对象所表示的连接所需的权限。
-
int getReadTimeout()
返回读取超时设置。返回 0 表示该选项已禁用(即无限期超时)。
-
Map<String,List<String>> getRequestProperties()
返回此连接的一般请求属性的不可修改的映射。
-
String getRequestProperty(String key)
返回此连接的命名一般请求属性的值。
-
URL getURL()
返回此 URLConnection
的 URL
字段的值。
-
boolean getUseCaches()
返回此 URLConnection
的 useCaches
字段的值。
-
static String guessContentTypeFromName(String fname)
尝试根据指定的 URL
的 “文件” 组件确定对象的内容类型。
-
static String guessContentTypeFromStream(InputStream is)
尝试根据输入流开头的字符确定输入流的类型。
-
void setAllowUserInteraction(boolean allowuserinteraction)
设置此 URLConnection
的 allowUserInteraction
字段的值。
-
void setConnectTimeout(int timeout)
设置一个指定的超时值(以毫秒为单位),在打开与此 URLConnection
引用的资源的通信链接时使用。
-
static void setContentHandlerFactory(ContentHandlerFactory fac)
设置应用程序的 ContentHandlerFactory
。
-
static void setDefaultAllowUserInteraction(boolean defaultallowuserinteraction)
将所有未来 URLConnection
对象的 allowUserInteraction
字段的默认值设置为指定值。
-
void setDefaultUseCaches(boolean defaultusecaches)
将 useCaches
字段的默认值设置为指定值。
-
static void setDefaultUseCaches(String protocol, boolean defaultVal)
将给定协议的 useCaches
字段的默认值设置为给定值。
-
void setDoInput(boolean doinput)
将此 URLConnection
的 doInput
字段的值设置为指定值。
-
void setDoOutput(boolean dooutput)
将此 URLConnection
的 doOutput
字段的值设置为指定值。
-
static void setFileNameMap(FileNameMap map)
设置文件名映射。
-
void setIfModifiedSince(long ifmodifiedsince)
将此 URLConnection
的 ifModifiedSince
字段的值设置为指定值。
-
void setReadTimeout(int timeout)
将读取超时设置为指定的超时值(以毫秒为单位)。
-
void setRequestProperty(String key, String value)
设置一般请求属性。
-
void setUseCaches(boolean usecaches)
将此 URLConnection
的 useCaches
字段的值设置为指定值。
-
String toString()
返回此 URL
连接的字符串表示形式。
示例
下面的 URLConnectionDemo
程序连接到从命令行输入的 URL
。
如果 URL
表示一个 HTTP 资源,则连接会被转换为 HttpURLConnection
,并且资源中的数据将一次一行地被读取。
package com.tutorialspoint;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
public class URLConnDemo {
public static void main(String [] args) {
try {
URL url = new URL("https://www.tutorialspoint.com");
URLConnection urlConnection = url.openConnection();
HttpURLConnection connection = null;
if(urlConnection instanceof HttpURLConnection) {
connection = (HttpURLConnection) urlConnection;
} else {
System.out.println("请提供一个 HTTP URL。");
return;
}
BufferedReader in = new BufferedReader(
new InputStreamReader(connection.getInputStream()));
String urlString = "";
String current;
while((current = in.readLine()) != null) {
urlString += current;
}
System.out.println(urlString);
} catch (IOException e) {
e.printStackTrace();
}
}
}
此程序的一个样本运行结果如下:
输出
$ java URLConnDemo
.....tutorialspoint.com 主页的完整 HTML 内容.....