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

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

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

开始课程

在Java中使用AWS SDK和MinIO操作S3及云存储



兼容Amazon S3(Simple Storage Service)协议的云对象存储已成为存储非结构化数据(如图像、视频、日志、备份和构建产物)的事实标准。在Java中,与这类存储交互的主要工具是AWS SDK for Java(S3模块)。然而,对于本地开发、测试或使用自托管解决方案,通常使用MinIO——一个高性能的S3兼容存储,并配有自身的Java客户端。本文将介绍这两种方法。



1. 准备与依赖引入



首先,在您的pom.xml(Maven)中添加依赖:



<dependency>    <groupId>software.amazon.awssdk</groupId>    <artifactId>s3</artifactId>    <version>2.30.0</version></dependency>

<!-- 用于MinIO(AWS SDK的替代方案) --><dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>8.5.17</version></dependency>


2. 创建S3客户端



我们来看两种创建客户端的方式:用于Amazon S3(AWS)和用于MinIO(本地/自定义存储)。



2.1. Amazon S3客户端(AWS SDK)



使用静态构建器,指定区域和认证方式(例如,通过环境变量或IAM配置文件)。



import software.amazon.awssdk.regions.Region;import software.amazon.awssdk.services.s3.S3Client;

public class AwsS3Example { public static S3Client createAwsS3Client() { return S3Client.builder() .region(Region.EU_CENTRAL_1) // 法兰克福 .build(); // 使用默认的提供商链 }}


2.2. MinIO客户端



MinIO需要显式指定endpoint、access key和secret key。



import io.minio.MinioClient;

public class MinioExample { public static MinioClient createMinioClient() { return MinioClient.builder() .endpoint("http://localhost:9000") .credentials("minioadmin", "minioadmin") .build(); }}


3. 存储桶与对象的基本操作



无论选择哪个客户端,S3的操作逻辑都是通用的。我们来看关键场景。



3.1. 检查存储桶是否存在并创建



// AWS SDKpublic boolean bucketExists(S3Client s3, String bucketName) {    return s3.headBucket(HeadBucketRequest.builder()            .bucket(bucketName)            .build())            .sdkHttpResponse().isSuccessful();}

// MinIO SDKpublic boolean bucketExists(MinioClient minio, String bucketName) { return minio.bucketExists(BucketExistsArgs.builder() .bucket(bucketName) .build());}

// 创建存储桶(AWS)s3.createBucket(CreateBucketRequest.builder() .bucket("my-unique-bucket-123") .createBucketConfiguration( CreateBucketConfiguration.builder() .locationConstraint("eu-central-1") .build()) .build());

// 创建存储桶(MinIO)minio.makeBucket(MakeBucketArgs.builder() .bucket("my-local-bucket") .build());


3.2. 上传文件(Upload)



从本地路径或数据流上传文件。



// AWS SDK - 从文件上传s3.putObject(PutObjectRequest.builder()        .bucket("my-bucket")        .key("uploads/report.pdf")        .build(),        Paths.get("/local/path/report.pdf"));

// MinIO SDK - 从InputStream上传try (InputStream is = new FileInputStream("/local/path/photo.jpg")) { minio.putObject(PutObjectArgs.builder()

推荐