在Java中将文件移动到不同的s3Location

时间:2017-07-14 19:57:58

标签: java amazon-s3

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

我目前可以将文件下载为S3Object,将该对象转换为文件(java.io,因为S3 Java客户端因为我不明白不允许你上传S3Object,所以您下载的对象!)并上传该文件。我很好奇是否有更好的方法。

谢谢!

2 个答案:

答案 0 :(得分:5)

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

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

请注意,这与典型本地文件系统中提供的重命名操作有很大不同,原因有多种:

  • 这不是原子的。大多数本地文件系统提供原子重命名操作,这对于构建安全" commit"或者" checkpoint"构造用于发布文件已完成写入并准备好供其他进程使用的事实。
  • 它没有本地文件系统重命名那么快。对于典型的本地文件系统,重命名是一种元数据操作,涉及操作inode中的少量信息。使用我描述的复制/删除技术,必须复制所有数据,即使S3在服务器端执行该复制。
  • 您的申请可能会受到Amazon S3 Data Consistency Model
  • 造成的独特边缘情况的影响

答案 1 :(得分:0)

您可以使用StorageService类的moveObject