我正在使用AWS S3客户端从S3下载大文件(约600MB左右)。但是在下载过程中,下载失败,出现Socket closed
或Premature end of Content-Length delimited message body
或Data received in non-data state: 6
等错误。错误消息不断从一个故障变为另一个故障。在一点点研究中,当AmazonS3
客户端在完全读取和写入输入流之前收集垃圾时,似乎会出现这样的问题。
https://forums.aws.amazon.com/thread.jspa?messageID=438171#
以下代码是什么
public void retrieve(String bucket, String key, String localFile){
AmazonS3 s3Client = createNewS3Client();
S3Object object = s3Client.getObject(bucket, key);
InputStream inputStream = object.getObjectContent();
OutputStream outputStream = new FileOutputStream(localFile);
//read bytes from inputstream and write to outputstream until EOF
writeBytes(inputStream, outputStream);
inputStream.close();
outputStream.close();
}
所以我的问题是 - 如果方法s3Client
需要更长的时间才能完成并且在它完成并返回之前,上述方法中的writeBytes
是否可以被垃圾收集? s3Client
方法中没有writeBytes
的引用。
答案 0 :(得分:0)
不,它不能。你可以在堆栈上找到它。
答案 1 :(得分:0)
在这里添加我的答案,这实际上解决了问题。
什么没有用?
为了避免垃圾收集,我在最后添加了一个使用s3Client
对象的日志语句。
正如评论中的人所建议的那样,在课堂上s3Client
选择一个字段是一种选择,但我无法做出改变。这可能已经解决了这个问题。
解决问题的原因是什么: 使用API getObject(GetObjectRequest getObjectRequest, File destinationFile)。它负责流处理,从流中读取内容和写入文件。