Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Android AWS s3 SDK下载抛出“Socket is closed”异常或提前终止大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试使用AWS Android SDK 1.0.4或1.0.3从S3下载对象.

这是我的代码

AmazonS3Client client = getConnection(userCredentials);
S3Object obj = client.getObject(workspac@R_874_8371@,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”异常或提前终止所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。