如何使用 Java 列出存储桶中的所有 AWS S3 对象1.x2.x
2022-08-31 11:28:22
使用 Java 获取 S3 存储桶中所有项目列表的最简单方法是什么?
List<S3ObjectSummary> s3objects = s3.listObjects(bucketName,prefix).getObjectSummaries();
此示例仅返回 1000 个项目。
使用 Java 获取 S3 存储桶中所有项目列表的最简单方法是什么?
List<S3ObjectSummary> s3objects = s3.listObjects(bucketName,prefix).getObjectSummaries();
此示例仅返回 1000 个项目。
这可能是一个解决方法,但这解决了我的问题:
ObjectListing listing = s3.listObjects( bucketName, prefix );
List<S3ObjectSummary> summaries = listing.getObjectSummaries();
while (listing.isTruncated()) {
listing = s3.listNextBatchOfObjects (listing);
summaries.addAll (listing.getObjectSummaries());
}
对于那些在2018 +中阅读本文的人。有两个新的无忧分页 API 可用:一个在适用于 Java 1.x 的 AWS 开发工具包中,另一个在 2.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)
方法进行控制。
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 将通过进行服务调用来开始延迟加载响应页面,直到没有页面或迭代停止。如果您的请求中存在错误,则只有在开始迭代可迭代对象后,您才会看到失败。