Java怎么重命名 Amazon S3 中的文件和文件夹

 更新时间:2023年10月24日 10:52:13   作者:bluetata  
在本文中,我们探讨了使用适用于 Java 的 AWS 开发工具包重命名 S3 存储桶中的文件和文件夹的方法,我们探索了两种不同的情况,它们使用相同的概念来重命名对象,用新名称复制它们并删除原始名称

一、概述

在本博文中,我们将探讨 如何使用 Java 重命名 Amazon S3 存储桶中的对象(文件或文件夹)。

Amazon Simple Storage Service (Amazon S3)是一种流行的云存储服务。它允许用户在云中存储和检索具有高持久性、可用性和可扩展性的数据。我们将在接下来的章节中使用适用于 Java 的 AWS 开发工具包与其进行交互。

二、前提条件

要重命名 S3 存储桶中的对象,我们可以利用 AWS SDK for Java 提供的S3Client类。

2.1 配置 Maven 依赖项

首先,我们需要 在项目的pom.xml中声明 AWS S3 SDK 依赖项:

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

2.2 配置 AWS 凭证

我们还需要设置一个 AWS 账户,安装 AWS CLI ,并使用我们的 AWS 凭证(AWS_ACCESS_KEY_IDAWS_SECERET_ACCESS_KEY)对其进行配置,以便能够以编程方式访问 AWS 资源。我们可以在 AWS 文档中找到完成此操作的所有步骤 。

我们使用构建器设计模式创建客户端。这是一个创建设计模式(关于设计模式后续可能会更新博文,这里挖个坑先),它将帮助我们创建这些复杂的对象。在我们的示例中,我们将在US_EAST_1区域创建存储桶。如果我们想要更改我们的首选区域,我们可以在官方文档(点击这里)中找到所有区域。

三、使用复制和删除重命名对象

目前,使用 SDK 重命名对象的唯一方法是复制具有不同名称的对象然后删除原始对象。我们还将在本节中举例说明这一点,解释每个步骤。

3.1 复制 S3 对象

在此步骤中,我们将使用上一点中创建的客户端来调用 AWS API。

首先,我们将为请求定义参数。假设我们有一个名为baeldung-s3-bucket的存储桶和一个名为simpleCSVFile.csv的 CSV 文件。我们想要将文件重命名为renamedFile.csv。让我们首先概述复制请求的参数:

String bucketName = "baeldung-s3-bucket";
String keyName = "simpleCSVFile.csv";
String destinationKeyName = "renamedFile.csv";

定义参数后,我们可以构造将发送到 AWS API 的CopyObjectRequest

CopyObjectRequest copyObjRequest = CopyObjectRequest.builder()
  .sourceBucket(bucketName)
  .sourceKey(keyName)
  .destinationBucket(destinationKeyName)
  .destinationKey(bucketName)
  .build();

现在我们可以使用AmazonS3客户端和请求复制对象 :

s3Client.copyObject(copyRequest);

如果我们在此停止并运行代码,我们将看到现在有两个文件,一个具有新的所需名称,另一个具有原始名称。

3.2 删除 S3 对象

我们还需要在复制后删除原始对象以完成重命名过程。我们将使用上一点中的参数定义 DeleteObjectRequest

DeleteObjectRequest deleteRequest = DeleteObjectRequest.builder()
  .bucket(bucketName)
  .key(keyName)
  .build();

我们将再次调用 S3 客户端来删除原始对象:

s3Client.deleteObject(deleteRequest);

四、重命名文件夹

上一点的方法仅适用于重命名简单对象。但是当我们必须重命名文件夹时,情况就会发生一些变化。重命名 Amazon S3 中的整个文件夹涉及迭代该文件夹中的所有对象并单独重命名每个对象

4.1 列出源文件夹中的所有对象

让我们首先列出给定文件夹中的所有对象:

ListObjectsV2Request listRequest = ListObjectsV2Request.builder()
  .bucket(bucketName)
  .prefix(sourceFolderKey)
  .build();

ListObjectsV2Response listResponse = s3Client.listObjectsV2(listRequest);
List<S3Object> objects = listResponse.contents();

我们使用存储桶名称和前缀初始化 ListObjectsV2Request 。文件夹中的对象实际上是所有以各自文件夹名称为键前缀的对象。

4.2 重命名文件夹中的所有对象键

现在我们有了列出文件夹中所有对象的代码,我们所要做的就是将它们全部复制到新目标并删除原始对象:

for (S3Object s3Object : objects) {
    String newKey = destinationFolderKey + s3Object.key().substring(sourceFolderKey.length());

    // Copy object to destination folder
    CopyObjectRequest copyRequest = CopyObjectRequest.builder()
      .sourceBucket(bucketName)
      .sourceKey(s3Object.key())
      .destinationBucket(bucketName)
      .destinationKey(newKey)
      .build();
    s3Client.copyObject(copyRequest);

    // Delete object from source folder
    DeleteObjectRequest deleteRequest = DeleteObjectRequest.builder()
      .bucket(bucketName)
      .key(s3Object.key())
      .build();
    s3Client.deleteObject(deleteRequest);
}

我们首先遍历对象列表,对于每一项,我们将通过用所需的新名称替换文件夹的旧名称来生成一个新密钥。获得新密钥后,我们所要做的就是将对象复制到新目的地并删除原始对象。

文末总结

在本文中,我们探讨了使用适用于 Java 的 AWS 开发工具包重命名 S3 存储桶中的文件和文件夹的方法。我们探索了两种不同的情况,它们使用相同的概念来重命名对象,用新名称复制它们并删除原始名称。希望对你有所帮助。

到此这篇关于Java重命名 Amazon S3 中的文件和文件夹的文章就介绍到这了,更多相关java 重命名 Amazon S3内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Springboot获取jar包中resources资源目录下的文件

    Springboot获取jar包中resources资源目录下的文件

    今天在项目中遇到一个业务场景,需要用到resources资源目录下的文件,本文主要介绍了Springboot获取jar包中resources资源目录下的文件,感兴趣的可以了解一下
    2023-12-12
  • SpringBoot捕获feign抛出异常的方法

    SpringBoot捕获feign抛出异常的方法

    使用Springboot时,使用feign客户端作为http请求工具时,当接口抛出异常信息时,使用全局异常是捕获不了异常的,本文小编给大家介绍了SpringBoot捕获feign抛出异常的方法,需要的朋友可以参考下
    2025-04-04
  • Java实现整数的逆序输出的三种方法

    Java实现整数的逆序输出的三种方法

    这篇文章主要介绍了Java实现整数的逆序输出的三种方法,第一种是无限制整数的逆序输出,第二种是非负整数的逆序输出,第三种是非特殊情况的逆序输出,每种方法给大家讲解的非常详细需要的朋友可以参考下
    2022-11-11
  • java集合快速构建成树形json实例

    java集合快速构建成树形json实例

    文章介绍了如何使用Java构建树形结构的JSON,并实现了一个代码工具来简化这一过程,该工具使用类适配器模式,允许灵活切换树形结构,且无需修改实体类代码,提高了代码的可维护性和扩展性
    2025-11-11
  • SpringBoot整合Redisson实现分布式锁

    SpringBoot整合Redisson实现分布式锁

    本文主要介绍了SpringBoot整合Redisson实现分布式锁,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Java中instanceof的基本语法与用法详解

    Java中instanceof的基本语法与用法详解

    这篇文章主要介绍了Java中instanceof的基本语法与用法的相关资料,instanceof是Java中用于检查对象是否是某个类或接口的实例的二元运算符,需要的朋友可以参考下
    2025-03-03
  • Spring @Transactional工作原理详解

    Spring @Transactional工作原理详解

    这篇文章主要介绍了Spring @Transactional工作原理详解,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • 深入理解Java虚拟线程

    深入理解Java虚拟线程

    Java虚拟线程通过M:N调度模型解决传统线程池高并发瓶颈,显著降低资源消耗和阻塞代价,提升吞吐量,下面就来介绍一下Java虚拟线程的使用,感兴趣的可以了解一下
    2025-07-07
  • Java并发编程中的synchronized解析

    Java并发编程中的synchronized解析

    这篇文章主要介绍了Java并发编程中的synchronized解析,synchronized是一个重量级的锁,使用不当的话其实会使我们程序执行的效率大打折扣,今天我们就对其进行讲解,需要的朋友可以参考下
    2023-11-11
  • java实现excel自定义样式与字段导出详细图文教程

    java实现excel自定义样式与字段导出详细图文教程

    最近接到一个需求,客户不满意原本导出的csv文件,想要导出Excel文件,下面这篇文章主要给大家介绍了关于java实现excel自定义样式与字段导出详细图文教程
    2023-09-09

最新评论