1. 背景介绍
对于Java开发者而言,经常需要从网页抓取信息并进行处理。在此过程中,程序需要读取网页的内容。本文将介绍如何在Java中,不使用任何外部库的情况下读取网页内容。
2. 使用URLConnection
2.1 URLConnection介绍
JAVA中的java.net包中提供了URLConnection类实现如下的功能
打开连接到指定地址
读取网页内容
获取HTTP响应码
获取HTTP响应头信息
上传数据到指定地址等
2.2 实现代码
下面的代码实现通过Java的URLConnection读取网页内容的主要过程。
这个代码示例演示了如何使用URLConnection读取一个网站的内容并打印到控制台。
try {
// 创建URL对象
URL url = new URL("https://www.example.com");
// 打开URLConnection连接
URLConnection conn = url.openConnection();
// 设置连接主机超时时间
conn.setConnectTimeout(5000);
// 设置从主机读取数据超时
conn.setReadTimeout(5000);
// 设置通用的请求属性
conn.setRequestProperty("Accept", "*/*");
conn.setRequestProperty("Connection", "keep-alive");
conn.setRequestProperty("User-Agent",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36");
// 建立连接
conn.connect();
// 获取所有响应头字段
Map> map = conn.getHeaderFields();
// 输出响应头的长度
System.out.println("Header size:" + map.size());
for (String key : map.keySet()) {
System.out.println(key + ": " + map.get(key));
}
// 定义BufferedReader输入流来读取URL的响应
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
StringBuilder sb=new StringBuilder();
while ((line = in.readLine()) != null) {
sb.append(line).append("\n");
}
System.out.println(sb.toString());
in.close();
} catch (Exception e) {
e.printStackTrace();
}
2.3 代码解析
在上述代码示例中,首先创建URL对象,将其作为参数传递给URLConnection类的openConnection()方法。通过openConnection()方法打开URLConnection连接,并设置连接主机超时时间和读取数据超时时间。接下来,通过设置通用的请求属性,如“User-Agent”、“Accept”等。此处的“User-Agent”是浏览器发送请求时的“User-Agent”字符串,告诉服务器客户端的浏览器环境和版本。最后,使用connect()方法建立连接。此时,系统会建立TCP连接,并发送HTTP请求到URL所指向的地址。
当服务器响应请求后,会把响应状态码、响应头等信息返回。在此示例中,通过getResponseCode()、getHeaderField()等方法可获取响应码、响应头等信息。
在获取响应内容时,可以使用getInputStream()方法获取输入流,再使用BufferedReader读取该输入流。BufferedReader的readLine()方法会一行一行地读取网页内容。
3. HttpURLConnection
3.1 HttpURLConnection介绍
JAVA中的HttpURLConnection继承自URLConnection类,提供更多的HTTP请求和响应抽象。HttpURLConnection可以方便地建立连接,并向服务器发送请求。因为HttpURLConnection的方法和属性都是针对HTTP的,所以它非常适用于使用HTTP协议访问Web服务的情况。
3.2 实现代码
下面的代码实现了如何使用HttpURLConnection读取网页内容的主要过程。这个代码示例演示了如何使用HttpURLConnection读取一个网站的内容并打印到控制台。
try {
// 创建URL对象
URL url = new URL("https://www.example.com");
// 打开HttpURLConnection连接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 设置连接主机超时时间
conn.setConnectTimeout(5000);
// 设置从主机读取数据超时
conn.setReadTimeout(5000);
// 设置通用的请求属性
conn.setRequestProperty("Accept", "*/*");
conn.setRequestProperty("Connection", "keep-alive");
conn.setRequestProperty("User-Agent",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36");
// 建立连接
conn.connect();
// 获取所有响应头字段
Map> map = conn.getHeaderFields();
// 输出响应头的长度
System.out.println("Header size:" + map.size());
for (String key : map.keySet()) {
System.out.println(key + ": " + map.get(key));
}
// 定义BufferedReader输入流来读取URL的响应
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
StringBuilder sb=new StringBuilder();
while ((line = in.readLine()) != null) {
sb.append(line).append("\n");
}
System.out.println(sb.toString());
in.close();
} catch (Exception e) {
e.printStackTrace();
}
3.3 代码解析
在上述代码示例中,首先创建URL对象,将其作为参数传递给HttpURLConnection类的openConnection()方法。
与URLConnection不同的是,HttpURLConnection在连接服务器时,会直接发送HTTP请求,因此,无需手动调用connect()方法建立连接。
由于HttpURLConnection继承自URLConnection,因此可以使用URLConnection的方法和属性。但是,由于HttpURLConnection的方法和属性都是针对HTTP的,因此HttpURLConnection更易于操作HTTP协议。
4. 总结
本文介绍了如何在Java中使用URLConnection和HttpURLConnection两个类读取网页内容。其中,URLConnection提供了更抽象的网络连接,可用于与Web服务器交互,并且可根据需要自定义网络请求。而HttpURLConnection则继承自URLConnection,并在此之上扩展了一些HTTP协议相关的方法和属性,使得更方便地发送HTTP请求。
需要注意的是,当读取大量数据时,代码示例中的读取方式可能会导致内存使用过多。为避免这种情况,可以使用按块读取的方式。但是,本文的示例着重于演示如何使用Java读取网页内容,因此没有涉及此部分。
在实际开发应用中,可以根据不同的需求,选择使用URLConnection或HttpURLConnection。同时,可以根据实际情况,灵活使用这些类的方法和属性,实现更加完善的网络编程逻辑。