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

如何使用AWS SDK for Java V2从Amazon S3存储桶读取文件

你使用的是AWS SDK for Java 2.x版本,该版本所有请求对象均采用Builder模式构建,不支持直接通过构造函数传参。你需要的文件名对应S3的对象键(Key),可以从遍历到的S3Object实例中直接获取,具体实现逻辑如下:

完整实现代码

在你原有代码的基础上补充遍历、请求构造和流处理逻辑即可:

import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.GetObjectRequest;
import software.amazon.awssdk.services.s3.model.ListObjectsV2Request;
import software.amazon.awssdk.services.s3.model.ListObjectsV2Response;
import software.amazon.awssdk.services.s3.model.S3Object;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.List;

public class S3ReadExample {
    public static void main(String[] args) {
        String bucketName = "some-name-s3";
        Region region = Region.US_EAST_1;
        S3Client s3client = S3Client
                .builder()
                .region(region)
                .build();

        ListObjectsV2Request listObjectsV2Request = ListObjectsV2Request.builder().bucket(bucketName).build();
        ListObjectsV2Response listObjectsV2 = s3client.listObjectsV2(listObjectsV2Request);
        List<S3Object> s3Objects = listObjectsV2.contents();

        // 遍历所有S3对象处理
        for (S3Object s3Object : s3Objects) {
            String objectKey = s3Object.key();
            // 跳过S3中的文件夹占位对象(零大小、后缀为/的虚拟对象)
            if (s3Object.size() == 0 && objectKey.endsWith("/")) {
                continue;
            }

            // 用Builder模式构建GetObject请求
            GetObjectRequest getObjectRequest = GetObjectRequest.builder()
                    .bucket(bucketName)
                    .key(objectKey)
                    .build();

            // 用try-with-resources自动关闭输入流,避免资源泄漏
            try (InputStream inputStream = s3client.getObject(getObjectRequest)) {
                // 此处为流处理逻辑,按需修改即可
                // 示例:读取小文本文件内容
                String fileContent = new String(inputStream.readAllBytes(), StandardCharsets.UTF_8);
                System.out.printf("读取文件%s成功,内容:%n%s%n", objectKey, fileContent);
            } catch (Exception e) {
                System.err.printf("读取文件%s失败:%s%n", objectKey, e.getMessage());
                // 按需添加异常处理逻辑,比如重试、跳过等
            }
        }

        // 操作完成后关闭S3客户端释放资源
        s3client.close();
    }
}

注意事项

  • 大文件处理不要一次性调用readAllBytes()读取全部内容到内存,避免OOM,建议逐段读取流内容,也可以通过GetObjectRequest.builder().range()参数分段下载大文件
  • 如需获取对象元数据(如内容类型、最后修改时间、文件大小),可以从流实例中获取:GetObjectResponse meta = inputStream.response();
  • S3Client实例内部已封装连接池管理,建议全局复用一个实例,不要每次请求都新建客户端
  • 运行前请确保你的身份凭证有对应存储桶的s3:GetObject权限,否则会抛出403权限错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 17:27:03