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;
});
}