本文主要介绍使用 Java 客户端来操作 MinIO,文中所使用到的软件版本:MinIO RELEASE.2025-07-23T15-54-02Z、MinIO Java 客户端 8.5.17、Centos 8.5.2111。
1、引入依赖
<dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.5.17</version> </dependency>
2、Java 客户端来操作 MinIO
2.1、创建 MinIO 客户端
@Before public void before() {minioClient = MinioClient.builder().endpoint("http://10.49.196.35:9000").credentials("minioadmin", "minioadmin").build(); }
2.2、桶操作
2.2.1、列出桶信息
@Test public void listBuckets() throws Exception {List<Bucket> list = minioClient.listBuckets();for (Bucket bucket : list) {log.info("bucket={}", bucket.name());} }
2.2.2、新建桶
@Test public void makeBucket() throws Exception {minioClient.makeBucket(MakeBucketArgs.builder().bucket("bucket1").build()); }
2.2.3、删除桶
@Test public void removeBucket() throws Exception {minioClient.removeBucket(RemoveBucketArgs.builder().bucket("bucket1").build()); }
2.2.4、判断桶是否存在
@Test public void bucketExists() throws Exception {boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket("bucket1").build());log.info("exists={}", exists); }
2.2.5、获取桶的标签
@Test public void getBucketTags() throws Exception {Tags tags = minioClient.getBucketTags(GetBucketTagsArgs.builder().bucket("test-bucket").build());log.info("tags={}", tags.get()); }
2.2.6、设置桶的标签
@Test public void setBucketTags() throws Exception {Map<String, String> map = new HashMap<>();map.put("Project", "Project One");map.put("User", "jsmith");minioClient.setBucketTags(SetBucketTagsArgs.builder().bucket("test-bucket").tags(map).build()); }
2.2.7、删除桶的标签
@Test public void deleteBucketTags() throws Exception {minioClient.deleteBucketTags(DeleteBucketTagsArgs.builder().bucket("test-bucket").build()); }
2.3、对象操作
2.3.1、列出桶中的对象信息
@Test public void listObjects() throws Exception {Iterable<Result<Item>> iterable = minioClient.listObjects(ListObjectsArgs.builder().bucket("test-bucket").prefix("abc").recursive(true).build());for (Result<Item> itemResult : iterable) {log.info("objectName={}", itemResult.get().objectName());} }
2.3.2、将输入流作为存储桶中的对象上传
@Test public void putObject() throws Exception {InputStream inputStream = new FileInputStream("d:/temp/a.png");ObjectWriteResponse objectWriteResponse = minioClient.putObject(PutObjectArgs.builder().bucket("test-bucket").object("abc/a.png").stream(inputStream, -1, 1024 * 1024 * 5).build());log.info("object={}", objectWriteResponse.object()); }
2.3.3、上传本地文件到桶
@Test public void uploadObject() throws Exception {ObjectWriteResponse objectWriteResponse = minioClient.uploadObject(UploadObjectArgs.builder().bucket("test-bucket").object("abc/a.png").filename("d:/temp/a.png").build());log.info("object={}", objectWriteResponse.object()); }
2.3.4、删除桶中对象
@Test public void removeObject() throws Exception {minioClient.removeObject(RemoveObjectArgs.builder().bucket("test-bucket").object("abc/a.png").build()); }
2.3.5、批量删除桶中对象
@Test public void removeObjects() throws Exception {List<DeleteObject> objects = new ArrayList<>();objects.add(new DeleteObject("abc/a.png"));objects.add(new DeleteObject("abc/a.txt"));Iterable<Result<DeleteError>> iterable = minioClient.removeObjects(RemoveObjectsArgs.builder().bucket("test-bucket").objects(objects).build());Iterator<Result<DeleteError>> iterator = iterable.iterator();while (iterator.hasNext()) {DeleteError deleteError = iterator.next().get();log.info("Error in deleting object {}; {}", deleteError.objectName(), deleteError.message());} }
2.3.6、获取桶中的对象
@Test public void getObject() throws Exception {InputStream in = minioClient.getObject(GetObjectArgs.builder().bucket("test-bucket").object("abc/a.png").build());OutputStream out = new FileOutputStream("d:/temp/a.png");//写出到输出流 IOUtils.copy(in, out);in.close();out.close(); }
2.3.7、将桶中对象下载到本地文件
@Test public void downloadObject() throws Exception {minioClient.downloadObject(DownloadObjectArgs.builder().bucket("test-bucket").object("abc/a.png").filename("d:/temp/a.png").build()); }
2.3.8、拷贝桶中对象
@Test public void copyObject() throws Exception {ObjectWriteResponse objectWriteResponse = minioClient.copyObject(CopyObjectArgs.builder().bucket("test-bucket").object("abc/a.txt").source(CopySource.builder().bucket("source-bucket").object("xyz/a.txt").build()).build());log.info("object={}", objectWriteResponse.object()); }
2.3.9、获取对象的标签
@Test public void getObjectTags() throws Exception {Tags tags = minioClient.getObjectTags(GetObjectTagsArgs.builder().bucket("test-bucket").object("abc/a.txt").build());log.info("tags={}", tags.get()); }
2.3.10、设置对象的标签
@Test public void setObjectTags() throws Exception {Map<String, String> map = new HashMap<>();map.put("Project", "Project One");map.put("User", "jsmith");minioClient.setObjectTags(SetObjectTagsArgs.builder().bucket("test-bucket").object("abc/a.txt").tags(map).build()); }
2.3.11、删除对象的标签
@Test public void deleteObjectTags() throws Exception {minioClient.deleteObjectTags(DeleteObjectTagsArgs.builder().bucket("test-bucket").object("abc/a.txt").build()); }
2.4、完整代码
package com.abc.minio;import io.minio.*; import io.minio.messages.*; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; import org.junit.After; import org.junit.Before; import org.junit.Test;import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.util.*;@Slf4j public class MinioCase {private MinioClient minioClient;@Beforepublic void before() {minioClient = MinioClient.builder().endpoint("http://10.49.196.35:9000").credentials("minioadmin", "minioadmin").build();}@Afterpublic void after() throws Exception {minioClient.close();}/*** 列出桶信息*/@Testpublic void listBuckets() throws Exception {List<Bucket> list = minioClient.listBuckets();for (Bucket bucket : list) {log.info("bucket={}", bucket.name());}}/*** 新建桶*/@Testpublic void makeBucket() throws Exception {minioClient.makeBucket(MakeBucketArgs.builder().bucket("bucket1").build());}/*** 删除桶*/@Testpublic void removeBucket() throws Exception {minioClient.removeBucket(RemoveBucketArgs.builder().bucket("bucket1").build());}/*** 判断桶是否存在*/@Testpublic void bucketExists() throws Exception {boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket("bucket1").build());log.info("exists={}", exists);}/*** 获取桶的标签*/@Testpublic void getBucketTags() throws Exception {Tags tags = minioClient.getBucketTags(GetBucketTagsArgs.builder().bucket("test-bucket").build());log.info("tags={}", tags.get());}/*** 设置桶的标签*/@Testpublic void setBucketTags() throws Exception {Map<String, String> map = new HashMap<>();map.put("Project", "Project One");map.put("User", "jsmith");minioClient.setBucketTags(SetBucketTagsArgs.builder().bucket("test-bucket").tags(map).build());}/*** 删除桶的标签*/@Testpublic void deleteBucketTags() throws Exception {minioClient.deleteBucketTags(DeleteBucketTagsArgs.builder().bucket("test-bucket").build());}/*** 列出桶中的对象信息*/@Testpublic void listObjects() throws Exception {Iterable<Result<Item>> iterable = minioClient.listObjects(ListObjectsArgs.builder().bucket("test-bucket").prefix("abc").recursive(true).build());for (Result<Item> itemResult : iterable) {log.info("objectName={}", itemResult.get().objectName());}}/*** 将输入流作为存储桶中的对象上传*/@Testpublic void putObject() throws Exception {InputStream inputStream = new FileInputStream("d:/temp/a.png");ObjectWriteResponse objectWriteResponse = minioClient.putObject(PutObjectArgs.builder().bucket("test-bucket").object("abc/a.png").stream(inputStream, -1, 1024 * 1024 * 5).build());log.info("object={}", objectWriteResponse.object());}/*** 上传本地文件到桶*/@Testpublic void uploadObject() throws Exception {ObjectWriteResponse objectWriteResponse = minioClient.uploadObject(UploadObjectArgs.builder().bucket("test-bucket").object("abc/a.png").filename("d:/temp/a.png").build());log.info("object={}", objectWriteResponse.object());}/*** 删除桶中对象*/@Testpublic void removeObject() throws Exception {minioClient.removeObject(RemoveObjectArgs.builder().bucket("test-bucket").object("abc/a.png").build());}/*** 批量删除桶中对象*/@Testpublic void removeObjects() throws Exception {List<DeleteObject> objects = new ArrayList<>();objects.add(new DeleteObject("abc/a.png"));objects.add(new DeleteObject("abc/a.txt"));Iterable<Result<DeleteError>> iterable = minioClient.removeObjects(RemoveObjectsArgs.builder().bucket("test-bucket").objects(objects).build());Iterator<Result<DeleteError>> iterator = iterable.iterator();while (iterator.hasNext()) {DeleteError deleteError = iterator.next().get();log.info("Error in deleting object {}; {}", deleteError.objectName(), deleteError.message());}}/*** 获取桶中的对象*/@Testpublic void getObject() throws Exception {InputStream in = minioClient.getObject(GetObjectArgs.builder().bucket("test-bucket").object("abc/a.png").build());OutputStream out = new FileOutputStream("d:/temp/a.png");//写出到输出流 IOUtils.copy(in, out);in.close();out.close();}/*** 将桶中对象下载到本地文件*/@Testpublic void downloadObject() throws Exception {minioClient.downloadObject(DownloadObjectArgs.builder().bucket("test-bucket").object("abc/a.png").filename("d:/temp/a.png").build());}/*** 拷贝桶中对象*/@Testpublic void copyObject() throws Exception {ObjectWriteResponse objectWriteResponse = minioClient.copyObject(CopyObjectArgs.builder().bucket("test-bucket").object("abc/a.txt").source(CopySource.builder().bucket("source-bucket").object("xyz/a.txt").build()).build());log.info("object={}", objectWriteResponse.object());}/*** 获取对象的标签*/@Testpublic void getObjectTags() throws Exception {Tags tags = minioClient.getObjectTags(GetObjectTagsArgs.builder().bucket("test-bucket").object("abc/a.txt").build());log.info("tags={}", tags.get());}/*** 设置对象的标签*/@Testpublic void setObjectTags() throws Exception {Map<String, String> map = new HashMap<>();map.put("Project", "Project One");map.put("User", "jsmith");minioClient.setObjectTags(SetObjectTagsArgs.builder().bucket("test-bucket").object("abc/a.txt").tags(map).build());}/*** 删除对象的标签*/@Testpublic void deleteObjectTags() throws Exception {minioClient.deleteObjectTags(DeleteObjectTagsArgs.builder().bucket("test-bucket").object("abc/a.txt").build());} }
参考:https://min-io.cn/docs/minio/linux/developers/java/minio-java.html。
