一、URL介绍
URL(Uniform Resource Locator)即统一资源定位器,是Internet上用来描述信息资源的一种方式,可以是图片、视频、文本等属性的数据。在Java中,可以通过URL对象来访问网络资源。
Java中的URL类提供了很多方法,以便于我们对URL进行操作,其中最常用的方法是openStream()方法,可以返回一个输入流,进而获取到文件或者文本的数据。
二、使用openStream()方法获取网络资源数据流
以下示例代码可以获取网络上的文本文件,并将文本文件输出到控制台中:
import java.net.*;
import java.io.*;
public class GetURLFile {
public static void main(String[] args) throws Exception {
URL url = new URL("http://www.example.com/text.txt");
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println(inputLine);
}
in.close();
}
}
代码解释:
- 创建URL对象:通过URL类的构造函数创建一个URL对象,并传入网络文件的URL地址。
- 使用openStream()方法获取输入流:调用URL对象的openStream()方法,获取网络文件的输入流。
- 读取输入流中的数据:通过BufferedReader类的readLine()方法读取网络文件的每一行。
- 关闭输入流:使用BufferedReader对象的close()方法关闭输入流。
三、使用URLConnection获取网络资源数据流
除了使用URL类的openStream()方法获取网络资源数据流外,还可以使用URLConnection类来获取网络资源的数据流。例如,以下示例代码演示了如何通过URLConnection类获取网络上的图片,并将图片保存到本地:
import java.io.*;
import java.net.*;
public class GetURLImage {
public static void main(String[] args) throws Exception {
URL url = new URL("http://www.example.com/image.png");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
InputStream inputStream = connection.getInputStream();
byte[] buffer = new byte[1024];
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
BufferedOutputStream bufferedOutputStream = null;
int len;
while ((len = inputStream.read(buffer)) != -1) {
byteArrayOutputStream.write(buffer, 0, len);
}
byte[] data = byteArrayOutputStream.toByteArray();
bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(new File("image.png")));
bufferedOutputStream.write(data);
bufferedOutputStream.flush();
bufferedOutputStream.close();
inputStream.close();
}
}
代码解释:
- 创建URL对象:同样,通过URL类的构造函数创建一个URL对象,并传入网络文件的URL地址。
- URLConnection类:使用URL对象的openConnection()方法获得一个URLConnection对象,然后再强制类型转换为HttpURLConnection。
- 获取输入流:使用URLConnection类的getInputStream()方法获取网络文件的输入流。
- 下载文件:通过输入流读取数据,并将数据写入到字节数组中,再将字节数组写入到输出流中,完成文件下载的过程。
四、如何获取HTTP头信息
当使用URLConnection进行HTTP访问时,可以通过URLConnection的getHeaderField()方法获取HTTP头信息。例如,以下代码演示了如何获取HTTP头信息:
import java.io.*;
import java.net.*;
public class GetHTTPHeader {
public static void main(String[] args) throws IOException {
URL url = new URL("http://www.example.com/");
URLConnection conn = url.openConnection();
// 获取所有头字段
Map<String, List<String>> map = conn.getHeaderFields();
for (String key : map.keySet()) {
System.out.println(key + ": " + map.get(key));
}
// 获取某个头字段
String contentType = conn.getHeaderField("Content-Type");
System.out.println(contentType);
}
}
代码解释:
- 获取所有头字段:使用URLConnection的getHeaderFields()方法获取所有头字段,返回一个Map<String, List<String>>对象。
- 遍历头字段:通过Map的keySet()方法获取所有头字段的键名,使用get()方法获取对应字段的值。
- 获取某个头字段:使用URLConnection的getHeaderField()方法获取指定头字段的值。
五、使用Java 8的URL读取网络资源
从Java 8开始,可以使用Stream API读取网络资源。例如,以下代码演示了如何使用Java 8的Stream API读取网络上的文本文件:
import java.net.*;
import java.util.stream.*;
public class ReadTextFile {
public static void main(String[] args) throws Exception {
URL url = new URL("http://www.example.com/text.txt");
try (Stream<String> stream = new BufferedReader(new InputStreamReader(url.openStream())).lines()) {
stream.forEach(System.out::println);
}
}
}
代码解释:
- 使用BufferedReader类读取网络文件的每一行,并使用lines()方法将其转换为Stream流。
- 使用forEach()方法输出Stream流中的每一行。
六、小结
通过Java的URL类和URLConnection类,我们可以轻松地读取和下载网络中的各种资源。通过本文的介绍,您应该已经了解了如何使用Java获取网络资源的数据流,下载和保存文件,以及获取HTTP头信息。