当前位置 : 主页 > 手机开发 > android >

Android AWS s3 SDK下载抛出“Socket is closed”异常或提前终止

来源:互联网 收集:自由互联 发布时间:2021-06-11
我正在尝试使用AWS Android SDK 1.0.4或1.0.3从S3下载对象. 这是我的代码: AmazonS3Client client = getConnection(userCredentials);S3Object obj = client.getObject(workspaceName, objectName);ObjectMetadata meta = obj.getObject
我正在尝试使用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);

这有时很少有效.大多数情况下,抛出“java.net.SocketException:Socket is closed”或者没有报告错误,但只读取了部分对象.

注意,对于IOUtils.toByteArray(…)来说,BufferedInputStream不是必需的,如果它存在与否则没有区别.

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

这发生在我的Android 2.3.3设备和3.2设备上.它发生在WiFi和3G上.

有任何想法吗?

PS>这些物体大约250k

问题是客户端正在收集垃圾.要修复它,您需要保持对S3Client的显式引用.

bug的流程如下:

>该程序获得一个S3客户端
>程序从客户端获取S3对象.
>程序从s3Object获取一个inputStream,它通过客户端获取它.
>垃圾收集运行,由于没有对客户端的引用,它会收集Garbage,随机关闭inputStream.

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

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

网友评论