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

如何通过文件名列表批量获取S3中的S3ObjectSummaries?

批量获取指定S3对象的实现方案

首先明确:你想要的withFileNames()这类直接在ListObjectsRequest中指定离散文件名列表的方式不可行——S3的ListObjects/ListObjectsV2接口仅支持按前缀、分隔符等规则做前缀匹配筛选,不支持传入指定文件名列表来精准返回目标对象。

要高效批量获取指定的500个文件,推荐以下两种方案:


方案1:使用AWS SDK v2的批量获取接口(最优解)

AWS SDK for Java v2提供了BatchGetObjectRequest接口,可一次性批量发起多个对象的获取请求,避免逐个调用的开销,单次最多支持1000个对象,完全覆盖你的500个需求。

代码示例

import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.BatchGetObjectRequest;
import software.amazon.awssdk.services.s3.model.GetObjectRequest;
import software.amazon.awssdk.services.s3.model.BatchGetObjectResponse;
import java.util.List;
import java.util.stream.Collectors;

public class S3BatchFetch {
    public void fetchTargetObjects(S3Client s3Client, String bucketName, List<String> targetKeys) {
        // 构造单个对象的请求列表
        List<GetObjectRequest> singleObjectRequests = targetKeys.stream()
                .map(key -> GetObjectRequest.builder()
                        .bucket(bucketName)
                        .key(key)
                        .build())
                .collect(Collectors.toList());

        // 组装批量请求
        BatchGetObjectRequest batchRequest = BatchGetObjectRequest.builder()
                .bucket(bucketName)
                .requests(singleObjectRequests)
                .build();

        // 执行批量获取
        BatchGetObjectResponse response = s3Client.batchGetObject(batchRequest);

        // 处理成功获取的对象
        response.successfulResponses().forEach(successResp -> {
            // 这里根据业务需求读取对象内容,例如:
            // InputStream objectContent = successResp.response().inputStream();
        });

        // 处理获取失败的对象(可选)
        response.failedResponses().forEach(failResp -> {
            System.err.printf("获取对象 %s 失败:%s%n", failResp.key(), failResp.errorCode());
        });
    }
}

方案2:SDK v1并行请求兼容方案

如果你仍在使用AWS SDK for Java v1(无批量获取接口),可以通过线程池并行发起单个GetObject请求,大幅缩短整体耗时,避免串行请求的低效问题。

代码示例

import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.GetObjectRequest;
import com.amazonaws.services.s3.model.S3Object;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class S3ParallelFetch {
    public void parallelFetchObjects(AmazonS3 s3Client, String bucketName, List<String> targetKeys) {
        // 根据服务器资源和S3并发限制调整线程数,建议50-100
        ExecutorService executor = Executors.newFixedThreadPool(50);

        for (String key : targetKeys) {
            executor.submit(() -> {
                try {
                    GetObjectRequest request = new GetObjectRequest(bucketName, key);
                    S3Object s3Object = s3Client.getObject(request);
                    // 处理对象内容
                } catch (Exception e) {
                    System.err.printf("获取对象 %s 失败:%s%n", key, e.getMessage());
                }
            });
        }

        executor.shutdown();
        // 等待所有任务完成(可选,根据业务场景调整超时时间)
        try {
            executor.awaitTermination(1, java.util.concurrent.TimeUnit.HOURS);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }
}

注意事项

  • 权限校验:确保你的IAM身份拥有目标桶和对象的GetObject权限;
  • 异常处理:批量/并行请求中可能存在对象不存在、权限不足等情况,需单独处理失败请求;
  • 并发限制:避免设置过高的线程数,防止触发S3的并发请求限制。

内容的提问来源于stack exchange,提问作者Rawley Fowler

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 04:53:38