You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用AWS Java SDK清空Amazon S3存储桶

Java编程清空Amazon S3存储桶实现方案

前置依赖

首先需要引入AWS SDK for Java 2.x的S3依赖,Maven配置示例如下:

<dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>s3</artifactId>
    <version>2.20.0</version> <!-- 可替换为最新稳定版 -->
</dependency>

通用实现步骤

  • 初始化S3客户端实例,默认会自动加载环境变量、本地AWS配置文件、运行环境IAM角色中的凭证信息,无需硬编码密钥
  • 遍历存储桶内所有对象,S3的列表接口默认单次最多返回1000个对象,需要处理分页逻辑拉取全量对象
  • 批量执行删除操作,单次删除请求最多支持删除1000个对象,减少API调用次数
  • 如果存储桶开启了版本控制,需要额外遍历删除所有版本的对象以及删除标记,否则无法完全清空存储桶

代码示例

1. 无版本控制存储桶清空代码

import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.*;
import java.util.ArrayList;
import java.util.List;

public class ClearS3Bucket {
    public static void clearNonVersionedBucket(String bucketName, Region region) {
        try (S3Client s3Client = S3Client.builder().region(region).build()) {
            ListObjectsV2Request listRequest = ListObjectsV2Request.builder().bucket(bucketName).build();
            ListObjectsV2Response listResponse;
            do {
                listResponse = s3Client.listObjectsV2(listRequest);
                if (listResponse.hasContents()) {
                    List<ObjectIdentifier> objectsToDelete = new ArrayList<>();
                    listResponse.contents().forEach(s3Object -> 
                        objectsToDelete.add(ObjectIdentifier.builder().key(s3Object.key()).build())
                    );
                    DeleteObjectsRequest deleteRequest = DeleteObjectsRequest.builder()
                        .bucket(bucketName)
                        .delete(Delete.builder().objects(objectsToDelete).build())
                        .build();
                    s3Client.deleteObjects(deleteRequest);
                }
                listRequest = ListObjectsV2Request.builder()
                    .bucket(bucketName)
                    .continuationToken(listResponse.nextContinuationToken())
                    .build();
            } while (listResponse.isTruncated());
        }
    }
}

2. 开启版本控制的存储桶清空代码

public static void clearVersionedBucket(String bucketName, Region region) {
    try (S3Client s3Client = S3Client.builder().region(region).build()) {
        ListObjectVersionsRequest listVersionsRequest = ListObjectVersionsRequest.builder().bucket(bucketName).build();
        ListObjectVersionsResponse listVersionsResponse;
        do {
            listVersionsResponse = s3Client.listObjectVersions(listVersionsRequest);
            List<ObjectIdentifier> objectsToDelete = new ArrayList<>();
            // 添加所有版本对象
            if (listVersionsResponse.hasVersions()) {
                listVersionsResponse.versions().forEach(version -> 
                    objectsToDelete.add(ObjectIdentifier.builder()
                        .key(version.key())
                        .versionId(version.versionId())
                        .build())
                );
            }
            // 添加所有删除标记
            if (listVersionsResponse.hasDeleteMarkers()) {
                listVersionsResponse.deleteMarkers().forEach(marker -> 
                    objectsToDelete.add(ObjectIdentifier.builder()
                        .key(marker.key())
                        .versionId(marker.versionId())
                        .build())
                );
            }
            if (!objectsToDelete.isEmpty()) {
                DeleteObjectsRequest deleteRequest = DeleteObjectsRequest.builder()
                    .bucket(bucketName)
                    .delete(Delete.builder().objects(objectsToDelete).build())
                    .build();
                s3Client.deleteObjects(deleteRequest);
            }
            listVersionsRequest = ListObjectVersionsRequest.builder()
                .bucket(bucketName)
                .keyMarker(listVersionsResponse.nextKeyMarker())
                .versionIdMarker(listVersionsResponse.nextVersionIdMarker())
                .build();
        } while (listVersionsResponse.isTruncated());
    }
}

注意事项

清空操作属于不可逆操作,执行前请确认存储桶内所有数据均可删除;如果存储桶内对象量级超过100万,建议优先使用S3生命周期规则设置对象到期自动删除,或使用S3批量操作任务完成清空,避免本地Java程序长时间运行消耗资源。

内容的提问来源于stack exchange,提问作者Anit Aggarwal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 00:06:02