在日常开发中,下载文件是很常见的需求。Hutool是一款优秀的Java工具库,它提供了方便简洁的文件下载方法。
一、下载文件流程
使用Hutool下载文件的流程如下:
File file = new File("D://test//test.xlsx");
HttpUtil.downloadFile("http://example.com/test.xlsx", file);
第一步:定义下载文件的存储路径及文件名;
第二步:使用HttpUtil.downloadFile()方法下载文件;
上述代码简单易懂,体现了Hutool的易用性。
二、下载图片
有时候我们需要从某些网站下载图片,下面是使用Hutool下载图片的方法:
File file = new File("D://test//test.jpg");
HttpUtil.downloadFile("http://example.com/test.jpg", file);
downloadFile()方法同样适用于图片下载。使用Hutool下载图片和文件一样简单。
三、下载大文件
如果需要下载大文件,我们可以使用get方法下载。如下所示,我们可以设置连接超时时间和读取超时时间:
HttpResponse response = HttpUtil.createGet(url)
.setConnectionTimeout(20000)
.setReadTimeout(120000)
.timeout(3600000)
.execute();
InputStream inputStream = response.bodyStream();
OutputStream out = new FileOutputStream("D://test//test.mp4");
IoUtil.copy(inputStream, out, IoUtil.DEFAULT_BUFFER_SIZE);
response.close();
在下载大文件时,我们不仅仅需要设置超时时间,还需要使用较大的buffer_size,以便能够快速读写。
四、断点续传
如果下载文件时,由于网络等原因导致下载失败,可以使用断点续传的方法。
String url = "http://example.com/test.xlsx";
File file = new File("D://test//test.xlsx");
long fileLen = file.length();
HttpRequest request = HttpUtil.createGet(url).header("User-Agent", HttpUtil.userAgent).header("Accept-Encoding", "identity");
HttpConnection connection = HttpUtil.getConnection(request.getUrl(), Method.GET, true);
if (fileLen > 0) {
connection.header("Range", "bytes=" + fileLen + "-");
}
HttpResponse response = HttpUtil.execute(request.method(connection));
if (response.getStatus() == HttpStatus.HTTP_NOT_MODIFIED) {
System.out.println("文件未修改");
} else if (response.getStatus() != HttpStatus.HTTP_PARTIAL_CONTENT) {
throw new HttpStatusException(response.getStatus(), response.getContent());
}
RandomAccessFile out = new RandomAccessFile(file, "rw");
if (fileLen > 0) {
out.seek(fileLen);
}
InputStream in = response.bodyStream();
int len;
byte[] buff = new byte[4096];
while ((len = in.read(buff)) != -1) {
out.write(buff, 0, len);
}
response.close();
out.close();
上面是使用断点续传的完整代码,其中设置了请求头Range,该请求头用于请求部分资源。设置Range后,服务端仅返回请求范围内的数据,这样可以使用多次请求的方式实现断点下载。
五、自动重试
下载文件时,有时候会由于网络波动等原因导致下载失败。这样我们需要在下载失败时,自动重试下载,以确保文件下载完成。
RetryUtil.executeBySimple(retryCount, retryTimeIntervalInMillis, new Callable(){
HttpResponse response = HttpUtil.createGet(url)
.setConnectionTimeout(20000)
.setReadTimeout(120000)
.execute();
InputStream inputStream = response.bodyStream();
OutputStream out = new FileOutputStream("D://test//test.mp4");
IoUtil.copy(inputStream, out, IoUtil.DEFAULT_BUFFER_SIZE);
response.close();
return null;
});
RetryUtil.executeBySimple()方法可以实现简单的重试功能,可以在请求失败之后进行自动重试。
六、总结
本文对使用Hutool下载文件做了详细的阐述,从下载文件的流程、下载图片、下载大文件、断点续传到自动重试,一一讲解。Hutool下载文件的方法简单易用,能够满足日常开发中的大部分需求。