使用AWS SDK在Java中操作S3和云存储
基于S3协议(Amazon Simple Storage Service)的云对象存储已成为非结构化数据存储的事实标准。在Java中,操作S3兼容存储(Amazon S3、MinIO、Yandex Object Storage、DigitalOcean Spaces等)使用的是官方库AWS SDK for Java。本文将介绍依赖引入、客户端初始化以及基本的文件操作。
引入AWS SDK
要使用S3,请在pom.xml(Maven)中添加依赖:
<dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3</artifactId> <version>2.27.0</version></dependency>对于Gradle:
implementation 'software.amazon.awssdk:s3:2.27.0'创建S3客户端
客户端通过构建器进行配置。对于Amazon S3,只需指定区域:
S3Client s3 = S3Client.builder() .region(Region.EU_CENTRAL_1) .build();对于兼容存储(MinIO、Yandex Object Storage),需要指定endpoint和credentials:
String endpoint = "https://storage.yandexcloud.net";String accessKey = "YOUR_ACCESS_KEY";String secretKey = "YOUR_SECRET_KEY";
S3Client s3 = S3Client.builder() .endpointOverride(URI.create(endpoint)) .region(Region.US_EAST_1) // 区域可以是任意值 .credentialsProvider(StaticCredentialsProvider.create( AwsBasicCredentials.create(accessKey, secretKey))) .build();存储桶基本操作
- 创建存储桶
- 检查是否存在
- 删除存储桶
创建存储桶示例:
String bucketName = "my-java-bucket";try { s3.createBucket(CreateBucketRequest.builder() .bucket(bucketName) .build()); System.out.println("存储桶已创建:" + bucketName);} catch (S3Exception e) { System.err.println("错误:" + e.awsErrorDetails().errorMessage());}上传文件(Upload)
可以从流、字符串或本地文件上传:
// 从本地文件上传s3.putObject(PutObjectRequest.builder() .bucket(bucketName) .key("docs/report.pdf") .build(), RequestBody.fromFile(Paths.get("/home/user/report.pdf")));
// 将字符串作为文本文件上传s3.putObject(PutObjectRequest.builder() .bucket(bucketName) .key("hello.txt") .contentType("text/plain") .build(), RequestBody.fromString("Hello, S3!"));下载文件(Download)
使用getObject获取对象:
// 下载到文件s3.getObject(GetObjectRequest.builder() .bucket(bucketName) .key("docs/report.pdf") .build(), ResponseTransformer.toFile(Paths.get("downloaded_report.pdf")));
// 下载为字符串String content = s3.getObjectAsBytes(GetObjectRequest.builder() .bucket(bucketName) .key("hello.txt") .build()) .asUtf8String();System.out.println(content);删除对象
s3.deleteObject(DeleteObjectRequest.builder() .bucket(bucketName) .key("hello.txt") .build());System.out.println("文件已删除");列出存储桶中的对象
要获取所有文件的列表(支持分页):
ListObjectsV2Request listReq = ListObjectsV2Request.builder() .bucket(bucketName) .maxKeys(100) .build();
ListObjectsV2Response listRes = s3.listObjectsV2(listReq);for (S3Object obj : listRes.contents()) { System.out.println(" - "