java - 使用 SDK 对 AWS S3 存储桶中的对象进行计数时计数不正确

标签 java scala amazon-web-services amazon-s3 aws-sdk

我正在使用 Scala 计算 AWS S3 存储桶中的对象数量,如下所示:

val reqAws:ListObjectsV2Request = new ListObjectsV2Request().withBucketName(awsBucketName).withPrefix(prefixForAws);
var resultAws:ListObjectsV2Result = null;
var totalFilesInAws:Int = 0;
do {
  resultAws = awsS3Client.listObjectsV2(reqAws);
  val summariesForAws:java.util.List[S3ObjectSummary] = resultAws.getObjectSummaries()
  totalFilesInAws = totalFilesInAws + summariesForAws.size().toInt
  val token:String = resultAws.getNextContinuationToken();
  reqAws.setContinuationToken(token);
} while (resultAws.isTruncated());

但是,它还为我提供了那些不包含任何对象的前缀的count

例如,如果我的前缀是 a/b/c 并且我的 S3 具有以下结构:

bucketName/a/b/c/d/obj1

bucketName/a/b/c/e/obj2

bucketName/a/b/c/f/

现在我们可以看到a/b/c/f没有对象,但是a/b/c/da/b/c/e 确实有对象,因此 count 应为 2,但我的代码给出的计数为 3。

如何修改代码以获得正确的计数

最佳答案

Amazon S3 实际上没有文件夹/目录。

例如,您可以运行以下命令:

aws s3 cp foo.txt s3://my-bucket/a/b/c/foo.txt

即使路径 a/b/c 不存在,该方法也有效。

然后,如果该对象被删除,路径就会消失。

这是因为每个对象的文件名(“Key”)是完整路径。 Amazon S3 让它“看起来”有目录,但实际上没有。

那么,当您创建文件夹时会发生什么?答案是系统创建一个与路径同名的零长度对象。

在您的例子中,有一个名为 /a/b/c/f/ 的零长度对象。这使得目录出现(即使没有目录这样的东西)。

虽然a/b/c/f/可能不包含对象,但一个名为a/b的对象/c/f/.

如何解决这个问题?以下是一些选项:

  • 不创建目录。让它们通过在给定路径中创建对象来自动“出现”。这样,就不会有目录名称的零长度文件。
  • 更改代码以忽略零长度对象。

关于java - 使用 SDK 对 AWS S3 存储桶中的对象进行计数时计数不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52865469/

相关文章:

java - 我所有的按钮点击方法在操作之前等待线程完成

scala - 如何在 Scalding 中定义源字段

amazon-web-services - 如何使用一个 CloudFormation 堆栈中的 SQS 队列作为另一个 CloudFormation 堆栈中的 lambda 函数的触发器?

json - AWS API 网关模型 : Invalid model schema specified

java - Java 中的加速像素阵列渲染

java - 弱引用和 `OutOfMemoryError` s

java - Spring Boot 测试中出现奇怪的 UnsatisfiedDependencyExceptions

scala - Scala 中的流

scala - 为什么这个函数会被多次调用?

java - 如何从 Amazon Cognito 代码/ token 获取委托(delegate)人