12

我最近不得不升级到 aws-java-sdk 1.11.108。我有一个 java 程序,可以将 s3 对象(8 到 10 GB 大小)下载到 EC2 盒子并将其作为流处理。该程序已经运行了 2 年以上,没有任何问题,但是在更新到最新版本的 aws-java-sdk 后,我的文件下载中途中止,日志中出现以下 WARN 消息(无一例外)

WARN:com.amazonaws.services.s3.internal.S3AbortableInputStream - Not all bytes were read from the S3ObjectInputStream, aborting HTTP connection. This is likely an error and may result in sub-optimal behavior. Request only the bytes you need via a ranged GET or drain the input stream after use.

S3Object s3Obj = s3client.getObject(new GetObjectRequest(bucketName, s3FileName));
Reader reader = new BufferedReader(new InputStreamReader(new  GZIPInputStream(s3Obj.getObjectContent());

如果有人能说出为什么流在没有抛出任何异常的情况下静默中止,我将不胜感激,以及使它工作的最佳方法是什么。

谢谢

4

2 回答 2

1

确保close()输入流只输入一次。

于 2017-06-26T11:53:43.313 回答
0

ZIP 档案最后有一个(冗余的)中央目录结构,因此您可以列出档案的内容而无需扫描整个内容。JavaZipInputStream从来没有真正从底层流中消耗它;getNextEntry() 在找到中央目录的开头后立即返回 null。您可以尝试添加 while (in.read() >= 0); 在您覆盖的关闭方法中读取到底层流的末尾?

https://github.com/aws/aws-sdk-java/issues/1111

于 2017-06-19T08:32:24.740 回答