Android AWS s3 SDK 下载抛出“套接字已关闭”异常或提前终止

Car*_*ten 4 android amazon-s3

我正在尝试使用 AWS Android SDK 1.0.4 或 1.0.3 从 S3 下载对象。

这是我的代码:

AmazonS3Client client = getConnection(userCredentials);
S3Object obj = client.getObject(workspaceName, objectName);
ObjectMetadata meta = obj.getObjectMetadata();
long size = meta.getContentLength();
logger.info("S3 object length: "+size);
InputStream is = new BufferedInputStream(obj.getObjectContent());
byte[] fragmentBytes = IOUtils.toByteArray(is);
logger.info("Read bytes: "+ fragmentBytes.length);
Run Code Online (Sandbox Code Playgroud)

这有时(但很少)有效。大多数情况下,要么抛出“java.net.SocketException:Socket is close”,要么不报告错误,但只读取对象的一部分。

请注意, 应该BufferedInputStream不是必需的,IOUtils.toByteArray(...)并且存在或不存在都没有区别。

在调试器中逐行单步执行代码时似乎不会出现该问题。

我的 Android 2.3.3 设备和 3.2 设备上会发生这种情况。它通过 WiFi 和 3G 进行。

有任何想法吗?

ps> 对象大约有250k大

小智 5

问题是客户端正在被垃圾收集。要修复此问题,您需要保留对 S3Client 的显式引用。

该bug的流程如下:

  1. 该程序获得一个S3客户端
  2. 该程序从客户端获取一个 S3 对象。
  3. 程序从 s3Object 获取 inputStream,s3Object 通过客户端获取。
  4. 垃圾收集运行,并且由于没有对客户端的引用,因此它会收集垃圾,随机关闭您的输入流。

IMO,这是亚马逊的一个非常严重的错误。为什么 S3 对象输入流没有返回到客户端的引用对我来说是一个谜。

以下是 AWS 论坛上的主题:https://forums.aws.amazon.com/thread.jspa ?threadID=83326