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

2022-08-31 11:28:22

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

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

此示例仅返回 1000 个项目。


答案 1

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

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

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

答案 2

对于那些在2018 +中阅读本文的人。有两个新的无忧分页 API 可用:一个在适用于 Java 1.x 的 AWS 开发工具包中,另一个在 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 将通过进行服务调用来开始延迟加载响应页面,直到没有页面或迭代停止。如果您的请求中存在错误,则只有在开始迭代可迭代对象后,您才会看到失败。


推荐