我正在尝试使用 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的流程如下:
IMO,这是亚马逊的一个非常严重的错误。为什么 S3 对象输入流没有返回到客户端的引用对我来说是一个谜。
以下是 AWS 论坛上的主题:https://forums.aws.amazon.com/thread.jspa ?threadID=83326
| 归档时间: |
|
| 查看次数: |
2934 次 |
| 最近记录: |