当前,我正在使用以下代码来下载文件:
ResponseEntity<Resource> response = this.restTemplate
.getForEntity(
uriToCall,
Resource.class
);
问题在于,当我尝试下载大文件时,代码会引发OutOfMemoryError
。
是否还有其他方法可以使我的大文件避免此错误?
编辑: 另一个问题。
我正在考虑应用FileSystemResource
而不是Resource
:
ResponseEntity<FileSystemResource> resp = this.restTemplate
.getForEntity(
uriToCall,
FileSystemResource.class
);
FileSystemResource
和Resource
之间有什么区别?那堂课要实现我的目标吗?
答案 0 :(得分:1)
对于大文件,更好的方法是使用流,因此大小仅受可用磁盘空间限制。 这样的事情应该起作用:
this.restTemplate.execute(uriToCall, HttpMethod.GET, null, clientHttpResponse -> {
File file= File.createTempFile("download", "tmp");
StreamUtils.copy(clientHttpResponse.getBody(), new FileOutputStream(file));
});
另请参阅此example,以获取暂停和继续播放的信息。
答案 1 :(得分:0)
有关类似问题的答案,请参见以下内容:
How to forward large files with RestTemplate?
按如下所示创建RestTemplate:
RestTemplate restTemplate = new RestTemplate();
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setBufferRequestBody(false);
restTemplate.setRequestFactory(requestFactory);
这应该可以解决您的内存不足问题。