使用Java SDK列出Amazon S3对象时出现重复条目问题求助
解决S3批量列取对象时重复出现最后一个对象的问题
问题原因
你碰到的这个重复问题,根源在于使用了AWS S3的旧版listObjects和listNextBatchOfObjects API。这些旧方法在处理截断的对象列表(当结果超过1000个时会自动截断)时,会把上一批的最后一个对象包含到下一批的结果里,这就导致了你看到的重复现象——同时因为默认单批最大返回1000个对象,加上重复的那一个,下一批就变成了1001个。AWS已经标记这些旧API为已废弃,并且推出了listObjectsV2系列方法来解决这类问题。
解决方案
把你的代码替换为使用listObjectsV2和listNextBatchOfObjectsV2方法,新版API会正确处理分页,不会出现重复对象,同时保持每批最多1000个的预期数量。
修改后的代码示例
BasicAWSCredentials credentials = new BasicAWSCredentials("foo", "bar"); AmazonS3 client = AmazonS3ClientBuilder .standard() .withCredentials(new AWSStaticCredentialsProvider(credentials)) .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(serviceEndpoint, null)) // 修正原代码的语法错误 .withPathStyleAccessEnabled(true) .withChunkedEncodingDisabled(true) .build(); ListObjectsV2Result listing = client.listObjectsV2("bucketname"); System.out.println("Listing size " + listing.getObjectSummaries().size()); System.out.println("At 0 index " + listing.getObjectSummaries().get(0).getKey()); if (!listing.getObjectSummaries().isEmpty()) { System.out.println("At last index " + listing.getObjectSummaries().get(listing.getObjectSummaries().size() - 1).getKey()); } someFunction(listing); // 注意保持与你实际方法的大小写一致 while (listing.isTruncated()) { System.out.println("-----------------------------------------------"); listing = client.listNextBatchOfObjectsV2(listing); System.out.println("Listing size " + listing.getObjectSummaries().size()); System.out.println("At 0 index " + listing.getObjectSummaries().get(0).getKey()); if (!listing.getObjectSummaries().isEmpty()) { System.out.println("At last index " + listing.getObjectSummaries().get(listing.getObjectSummaries().size() - 1).getKey()); } someFunction(listing); }
额外说明
- 新版的
ListObjectsV2Result使用getContinuationToken()跟踪下一批的起始位置,不会依赖上一批的最后一个对象,彻底避免了重复问题。 - 我修正了原代码中
EndpointConfiguration构造函数的语法错误(移除了多余的括号和无效注释)。 - 建议后续都使用
listObjectsV2相关方法,因为AWS已不再对旧版listObjects进行功能更新,未来可能会移除这些旧API。
内容的提问来源于stack exchange,提问作者Sachin RT
相关产品推荐
相关产品推荐

