您的位置:

使用Hutool下载文件详解

在日常开发中,下载文件是很常见的需求。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下载文件的方法简单易用,能够满足日常开发中的大部分需求。