并非所有字节都从S3ObjectInputStream中读取,从而中止HTTP连接

dee*_*dee 11 aws-java-sdk

我最近不得不升级到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());
Run Code Online (Sandbox Code Playgroud)

如果有人可以告诉为什么流静默地中止而不抛出任何异常,我会很感激,以及使它工作的最佳方法是什么.

谢谢

Abh*_*kar 0

ZIP 存档末尾有一个(冗余)中央目录结构,因此您可以列出存档的内容,而无需扫描整个内容。JavaZipInputStream从未真正从底层流中消耗它;getNextEntry() 一旦找到中央目录的开头就返回 null。您可以尝试添加 while (in.read() >= 0); 在您重写的 close 方法中读取底层流的末尾?

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