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

Ale*_*ser 4 java amazon-s3

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

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

谢谢!

Chr*_*oth 6

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

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

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

  • 它不是原子的.大多数本地文件系统提供原子重命名操作,这对于构建安全的"提交"或"检查点"构造非常有用,以发布文件完成正在编写并准备好供某些其他进程使用的事实.
  • 它没有本地文件系统重命名那么快.对于典型的本地文件系统,重命名是一种元数据操作,涉及操作inode中的少量信息.使用我描述的复制/删除技术,必须复制所有数据,即使S3在服务器端执行该复制也是如此.
  • 您的应用程序可能会受到Amazon S3数据一致性模型导致的独特边缘情况的影响.