使用Jsoup下载图片、PDF和压缩等文件时,需要将响应转换为输出流。转换为输出流的目的是增强写文件的能力,即以字节为单位写入指定文件。
以图片下载为例,程序3-12使用bodyStream()方法将响应转换为输出流,并以缓冲流的方式写入指定文件。另外,针对图片和PDF等文件,在执行URL请求获取Response时,必须通过ignoreContentType(boolean ignoreContentType)方法设置忽略响应内容的类型,否则会报错。
//程序3-12
public class JsoupConnectInputstream {
public static void main(String[] args) throws IOException {
String imageUrl = "https://www.leichuangkj.com/img/WechatIMG2.png";
Connection connect = Jsoup.connect(imageUrl);
Connection.Response response = connect.method(Connection.Method.GET).ignoreContentType(true).execute();
System.out.println("文件类型为:" + response.contentType());
//如果响应成功,则执行下面的操作
if (response.statusCode() == 200) {
//响应转化成输出流
BufferedInputStream bufferedInputStream = response.bodyStream();
//保存图片
saveImage(bufferedInputStream,"/Users/steven/Documents/代码/project/spider/src/main/java/com/file/1.jpg");
}
}
/**
* 保存图片操作
* @param inputStream
* @param savePath
* @throws IOException
*/
static void saveImage(BufferedInputStream inputStream, 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 = inputStream.read(buffer, 0, 1024)) != -1) {
bufferedOut.write(buffer, 0, len);
}
//缓冲流释放与关闭
bufferedOut.flush();
bufferedOut.close();
}
}
运行程序3-12,如下图所示,将在控制台输出响应文件的类型,并且图片会被下载到程序指定的路径下。