仅限Amazon S3 Java API下载50个对象

时间:2012-06-14 15:05:44

标签: java amazon-s3 amazon

这给了我一个主要的头疼,所以我想我会发布简单的解决方案。 我的问题是,当使用Amazon API的Java API时,我只能下载50个对象才能神秘地超时。代码看起来像这样:

int counter = 0;
AmazonS3Client s3 = new AmazonS3Client(propertiesFile);
while(objectList.isTruncated()){
for(S3ObjectSummary objectSummary : objectList.getObjectSummaries()){
    System.out.println(++counter);
    S3Object object = s3.getObject(new GetObjectRequest(bucketName, objectSummary.getKey()));
//do stuff
}
}

它会运行并处理一切正常的50个对象,然后超时。

3 个答案:

答案 0 :(得分:2)

无论出于何种原因,主要问题是我已将s3声明为AmazonS3Client s3。应该看起来像:

AmazonS3 s3 = new AmazonS3Client(propertiesFile);

以防其他人遇到此问题。

答案 1 :(得分:0)

希望您可以调用getObject来下载它,但是您没有关闭InputStream。可以通过调用getObject()来选择;你必须在处理每个对象后关闭InputStream。

更多细节阅读:http://docs.amazonwebservices.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/AmazonS3Client.html#getObject(com.amazonaws.services.s3.model.GetObjectRequest

由于

答案 2 :(得分:0)

对于Scala开发人员,这里使用官方AWS SDK for Java执行 完整扫描并映射 的AmazonS3存储桶内容的递归功能

import com.amazonaws.services.s3.AmazonS3Client
import com.amazonaws.services.s3.model.{S3ObjectSummary, ObjectListing, GetObjectRequest}
import scala.collection.JavaConversions.{collectionAsScalaIterable => asScala}

def map[T](s3: AmazonS3Client, bucket: String, prefix: String)(f: (S3ObjectSummary) => T) = {

  def scan(acc:List[T], listing:ObjectListing): List[T] = {
    val summaries = asScala[S3ObjectSummary](listing.getObjectSummaries())
    val mapped = (for (summary <- summaries) yield f(summary)).toList

    if (!listing.isTruncated) mapped.toList
    else scan(acc ::: mapped, s3.listNextBatchOfObjects(listing))
  }

  scan(List(), s3.listObjects(bucket, prefix))
}

要调用上面的curry map()函数,只需在第一个参数中传递已构造的(并且已正确初始化的)AmazonS3Client对象(请参阅官方AWS SDK for Java API Reference),存储桶名称和前缀名称名单。同时传递要应用的函数f()以映射第二个参数列表中的每个对象摘要。

例如

val tuple = map(s3, bucket, prefix)(s => (s.getKey, s.getOwner, s.getSize))

将返回该存储桶/前缀

(key, owner, size)个元组的完整列表

val totalSize = map(s3, "bucket", "prefix")(s => s.getSize).sum

将返回其内容的总大小(请注意在表达式末尾应用的额外sum()折叠函数; - )

您可以map()将{{1}}与许多其他功能结合起来Monads in Functional Programming