RestTemplate大文件下载

场景

默认使用RestTemplate下载文件时,会读取所有的流之后再返回,如果文件流比较大的话,会对系统造成很大的压力,因此需要支持边读边写,及时释放内存,以此达到减少内存压力的效果。

实现

得到body流,由我们内部的程序自己去进行读写,而不是由RestTemplate读完缓存在内存中给到我们。

void downLoadBigFile() throws IOException {
    // 待下载的文件地址
    String url = "http://xxxx";
    // 文件保存的本地路径
    String targetPath = "E:\\xxx";
    // 定义请求头的接收类型
    RequestCallback requestCallback = request -> request.getHeaders().setAccept(Arrays.asList(MediaType.APPLICATION_OCTET_STREAM, MediaType.ALL));
        // 对响应进行流式处理而不是将其全部加载到内存中
        restTemplate.execute(url, HttpMethod.GET, requestCallback, clientHttpResponse -> {
            Files.copy(clientHttpResponse.getBody(), Paths.get(targetPath));
        return null;
    });
}