如何使用 Java 列出存储桶中的所有 AWS S3 对象

新手上路,请多包涵

使用 Java 获取 S3 存储桶中所有项目的列表的最简单方法是什么?

 List<S3ObjectSummary> s3objects = s3.listObjects(bucketName,prefix).getObjectSummaries();

此示例仅返回 1000 个项目。

原文由 Ron D. 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.9k
2 个回答

这可能是一种解决方法,但这解决了我的问题:

 ObjectListing listing = s3.listObjects( bucketName, prefix );
List<S3ObjectSummary> summaries = listing.getObjectSummaries();

while (listing.isTruncated()) {
   listing = s3.listNextBatchOfObjects (listing);
   summaries.addAll (listing.getObjectSummaries());
}

原文由 Ron D. 发布,翻译遵循 CC BY-SA 3.0 许可协议

对于那些在 2018 年以后阅读本文的人。有两个新的无分页 API 可用:一个在 AWS SDK for Java 1.x 中,另一个在 2.x 中。

1.x

Java SDK 中有一个 新的 API ,允许您在不处理分页的情况下迭代 S3 存储桶中的对象:

 AmazonS3 s3 = AmazonS3ClientBuilder.standard().build();

S3Objects.inBucket(s3, "the-bucket").forEach((S3ObjectSummary objectSummary) -> {
    // TODO: Consume `objectSummary` the way you need
    System.out.println(objectSummary.key);
});

这个迭代是惰性的:

S3ObjectSummary 的列表将根据需要延迟获取,一次获取一页。页面的大小可以用 withBatchSize(int) 方法控制。

2.x

API 已更改,因此这里是 SDK 2.x 版本:

 S3Client client = S3Client.builder().region(Region.US_EAST_1).build();
ListObjectsV2Request request = ListObjectsV2Request.builder().bucket("the-bucket").prefix("the-prefix").build();
ListObjectsV2Iterable response = client.listObjectsV2Paginator(request);

for (ListObjectsV2Response page : response) {
    page.contents().forEach((S3Object object) -> {
        // TODO: Consume `object` the way you need
        System.out.println(object.key());
    });
}

ListObjectsV2Iterable 也是懒惰的:

调用该操作时,将返回此类的一个实例。此时,尚未进行任何服务调用,因此无法保证请求有效。当您遍历可迭代对象时,SDK 将开始通过调用服务来延迟加载响应页面,直到没有页面剩余或您的迭代停止。如果请求中有错误,只有在开始迭代可迭代对象后才会看到失败。

原文由 madhead 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题