You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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);
}

额外说明

  1. 新版的ListObjectsV2Result使用getContinuationToken()跟踪下一批的起始位置,不会依赖上一批的最后一个对象,彻底避免了重复问题。
  2. 我修正了原代码中EndpointConfiguration构造函数的语法错误(移除了多余的括号和无效注释)。
  3. 建议后续都使用listObjectsV2相关方法,因为AWS已不再对旧版listObjects进行功能更新,未来可能会移除这些旧API。

内容的提问来源于stack exchange,提问作者Sachin RT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:04:50