
这是我的代码:
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
总结以上是内存溢出为你收集整理的Android AWS s3 SDK下载抛出“Socket is closed”异常或提前终止全部内容,希望文章能够帮你解决Android AWS s3 SDK下载抛出“Socket is closed”异常或提前终止所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)