今天博主在学习研究Java网络爬虫时总体过了一遍Jsoup的相关知识,因此对部分知识点进行了总结梳理。
在使用Jsoup下载图片、PDF和压缩文件等文件时,需要将响应转化成输出流。转化成输出流的目的是增强写文件的能力,即以字节为单位写入到指定文件。
相关代码如下所示:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import org.jsoup.Connection;
import org.jsoup.Connection.Method;
import org.jsoup.Connection.Response;
import org.jsoup.Jsoup;
public class JsoupConnectInputstream {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
String imageUrl = "https://pics2.baidu.com/feed/"
+ "838ba61ea8d3fd1fbd5a89ffb395331997ca5f81.jpeg?"
+ "token=356d8430ac041f2c1a62dc7630578813&s=3FF6109F040264E404BCEBFB0300702F";
Connection connect = Jsoup.connect(imageUrl);
Response response = connect.method(Method.GET).ignoreContentType(true).execute();
System.out.println("文件类型为:" + response.contentType());
// 响应转换成输入流
BufferedInputStream bufferedInputStream = response.bodyStream();
// 保存图片到项目文件夹HelloMaven下的image文件夹中
saveImage(bufferedInputStream, "image/1.jpg");
}
/**
* saveImage保存图片操作
* @param 输入流
* @param 保存的文件目录
* @throws IOException
*/
static void saveImage(BufferedInputStream in, String savePath) throws IOException {
byte[] buffer = new byte[1024];
int len = 0;
// 创建缓冲流
FileOutputStream fileOutStream = new FileOutputStream(new File(savePath));
BufferedOutputStream bufferedOut = new BufferedOutputStream(fileOutStream);
// 图片写入
while((len = in.read(buffer, 0, 1024)) != -1) {
bufferedOut.write(buffer, 0, len);
}
// 缓冲流释放与关闭
bufferedOut.flush();
bufferedOut.close();
}
}
其中,针对图片和PDF等文件,在执行URL请求获取Response时,必须通过ignoreContentType(boolean ignoreContentType)方法设置忽略响应内容的类型,否则会报错。
关于图片写入这部分代码块,read函数返回的是缓冲数组中实际上读入的字节数。
// 图片写入
while((len = in.read(buffer, 0, 1024)) != -1) {
bufferedOut.write(buffer, 0, len);
}
public abstract int read():
读取一个byte数据,返回值是高位补0的int类型值。若返回值为-1,说明未读取到任何字节,此时读取工作结束。