URL代表统一资源定位符,表示万维网上的资源,例如:网页或FTP目录。
本节介绍如何编写与URL通信相关的Java程序。URL可以分解为多个部分,如下所示 -
protocol://host:port/path?query#ref
协议示例中,包括HTTP,HTTPS,FTP和文件。路径也称为文件名,主机也称为权限。
以下是协议为HTTP的网页的URL -
https://www.yiibai.com/index.html?language=cn#j2se
注意,此URL未指定端口,在这种情况下将使用协议的默认端口。使用HTTP,默认端口为
80
。
1. URL类方法
java.net.URL
类表示一个URL,并具有一组完整的方法来操作Java中的URL。
URL
类有几个用于创建URL的构造函数,它们分别如下所示 -
编号 | 构造函数 | 描述 |
---|---|---|
1 | public URL(String protocol, String host, int port, String file) throws MalformedURLException |
通过将给定部分放在一起来创建URL。 |
2 | public URL(String protocol, String host, String file) throws MalformedURLException |
与前一个构造函数相同,只是使用了给定协议的默认端口。 |
3 | public URL(String url) throws MalformedURLException |
根据给定的字符串创建一个URL。 |
4 | public URL(URL context, String url) throws MalformedURLException |
通过一起解析URL和字符串参数来创建URL。 |
URL
类包含许多用于访问所表示的URL的各个部分的方法。URL
类中的一些常用的方法 -
编号 | 方法 | 描述 |
---|---|---|
1 | public String getPath() |
返回URL的路径。 |
2 | public String getQuery() |
返回URL的查询部分。 |
3 | public String getAuthority() |
返回URL的权限。 |
4 | public int getPort() |
返回URL的端口。 |
5 | public int getDefaultPort() |
返回URL协议的默认端口。 |
6 | public String getProtocol() |
返回URL的协议。 |
7 | public String getHost() |
返回URL的主机。 |
8 | public String getFile() |
返回URL的文件名。 |
9 | public String getRef() |
返回URL的引用部分。 |
10 | public URLConnection openConnection() throws IOException |
打开与URL的连接,允许客户端与资源通信。 |
示例
以下URLDemo.java
程序演示了URL的各个部分。URLDemo程序输出给定URL的每个部分。
// 文件名称 : URLDemo.java
import java.net.*;
import java.io.*;
public class URLDemo {
public static void main(String[] args) {
try {
URL url = new URL("http://www.kaops.com/index.html?language=zh#j2se");
System.out.println("URL: " + url.toString());
System.out.println("protocol: " + url.getProtocol());
System.out.println("authority: " + url.getAuthority());
System.out.println("file name: " + url.getFile());
System.out.println("host: " + url.getHost());
System.out.println("path: " + url.getPath());
System.out.println("port: " + url.getPort());
System.out.println("default port: " + url.getDefaultPort());
System.out.println("query: " + url.getQuery());
System.out.println("ref: " + url.getRef());
} catch (IOException e) {
e.printStackTrace();
}
}
}
执行上面示例代码,得到以下结果 -
URL: http://www.kaops.com/index.html?language=zh#j2se
protocol: http
authority: www.kaops.com
file name: /index.html?language=zh
host: www.kaops.com
path: /index.html
port: -1
default port: 80
query: language=zh
ref: j2se
2. URLConnections类方法
openConnection()
方法返回一个java.net.URLConnection
,一个抽象类,它的子类代表各种类型的URL连接。
例如 -
如果连接到协议为HTTP的URL,则openConnection()
方法返回HttpURLConnection
对象。
如果连接到表示JAR文件的URL,则openConnection()
方法返回JarURLConnection
对象等。
URLConnection
类有许多方法可用于设置或确定有关连接的信息,包括以下方法 -
编号 | 构造函数 | 描述 |
---|---|---|
1 | Object getContent() |
检索此URL连接的内容。 |
2 | Object getContent(Class[] classes) |
检索此URL连接的内容。 |
3 | String getContentEncoding() |
返回content-encoding 头字段的值。 |
4 | int getContentLength() |
返回content-length 头字段的值。 |
5 | String getContentType() |
返回content-type 头字段的值。 |
6 | int getLastModified() |
返回last-modified 头字段的值。 |
7 | long getExpiration() |
返回expired 头字段的值。 |
8 | long getIfModifiedSince() |
返回此对象的ifModifiedSince 字段的值。 |
9 | public void setDoInput(boolean input) |
传入true 表示连接将用于输入。默认值为true ,因为客户端通常从URLConnection 读取。 |
10 | public void setDoOutput(boolean output) |
传入true 表示连接将用于输出。默认值为false ,因为许多类型的URL不支持写入。 |
11 | public InputStream getInputStream() throws IOException |
返回URL连接的输入流,以便从资源中读取。 |
12 | public OutputStream getOutputStream() throws IOException |
返回用于写入资源的URL连接的输出流。 |
13 | public URL getURL() |
返回此URLConnection 对象所连接的URL。 |
示例
以下URLConnectionDemo.java
程序连接到指定的URL。
如果URL表示HTTP资源,则连接将转换为HttpURLConnection
,并且一次读取一行资源中的数据。
// 文件名称 : URLConnDemo.java
import java.net.*;
import java.io.*;
public class URLConnDemo {
public static void main(String[] args) {
try {
URL url = new URL("http://www.kaops.com");
URLConnection urlConnection = url.openConnection();
HttpURLConnection connection = null;
if (urlConnection instanceof HttpURLConnection) {
connection = (HttpURLConnection) urlConnection;
} else {
System.out.println("Please enter an 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();
}
}
}