在Java中使用S3和云存储:AWS SDK库

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

使用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(" - "

推荐