2017-07-14 42 views
2

我的用例如下。我想使用Java S3 SDK将文件从某个s3Location移动到不同的s3Location。 例如,如果文件在bucket/current中,我想将它移动到bucket/old将文件移动到Java中的其他s3Location中

我目前可以将文件下载为S3Object,将该对象转换为File(java.io,由于S3 Java客户端,因为我不明白的原因不允许您上传S3Object,所以同一个对象你下载!)并上传该文件。我很好奇,如果有更好的方法来做到这一点。

谢谢!

回答

2

在S3中没有直接执行重命名或移动操作。相反,典型的解决方案是将对象复制到新位置,然后删除原件。您可以使用AWS SDK for Java的AmazonS3#copyObjectAmazonS3#deleteObject方法完成此操作。

这比您在本地下载文件的问题中描述的技术更高效,然后在新密钥下重新上传。 copyObject内部使用S3 REST API PUT Object - Copy操作中提供的S3服务器端副本。该副本在S3服务器端执行,因此与本地文件下载/上传相比,您不必支付I/O成本(以及从AWS服务器转出的实际资金成本)。

请注意,这是作为一个典型的本地文件系统提供的,出于多种原因,重命名操作很大的不同:

  • 这是不是原子。大多数本地文件系统提供了原子重命名操作,这对于构建安全的“提交”或“检查点”结构来发布文件已完成写入并准备供其他进程使用的事实很有用。
  • 它不如本地文件系统重命名。对于典型的本地文件系统,重命名是一种元数据操作,涉及操作inode中的少量信息。使用我描述的复制/删除技术,即使在S3服务器端执行该复制,也必须复制所有数据。
  • 您的应用程序可能会受到由Amazon S3 Data Consistency Model引起的独特边缘情况的限制。
相关问题