如何使用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
相关产品推荐
相关产品推荐

