Amazon web services 在AWS s3中,我是否可以使用最后一个标记I';你储存了什么?
我这样做是为了使用文件夹中的所有文件。现在,经过一段时间后,我想使用存储标记只获取写入该文件夹的新文件。这样行吗?这对你没有帮助,原因有两个:Amazon web services 在AWS s3中,我是否可以使用最后一个标记I';你储存了什么?,amazon-web-services,amazon-s3,aws-sdk,Amazon Web Services,Amazon S3,Aws Sdk,我这样做是为了使用文件夹中的所有文件。现在,经过一段时间后,我想使用存储标记只获取写入该文件夹的新文件。这样行吗?这对你没有帮助,原因有两个: 标记只是一个词汇标记。对象键按词法(“字母顺序”)顺序返回(按对象键的utf-8编码表示进行二进制排序),而不是对象创建的顺序 在最后一个响应上,响应未被截断,因此下一个标记应为null或未设置 根据SDK实际调用的服务的API引用: NextMarker 当响应被截断时(即响应中的IsTruncated元素值为true),您可以在后续请求中使用此字
- 标记只是一个词汇标记。对象键按词法(“字母顺序”)顺序返回(按对象键的utf-8编码表示进行二进制排序),而不是对象创建的顺序
- 在最后一个响应上,响应未被截断,因此下一个标记应为null或未设置
NextMarker
当响应被截断时(即响应中的IsTruncated
元素值为true),您可以在后续请求中使用此字段中的键名作为标记来获取下一组对象。AmazonS3按字典顺序以UTF-8字符编码列出对象
我可以找到一种解决方法,并且只有在我们能够控制存储在存储桶中的对象密钥的命名时才适用
- 在对象键上附加一些accending前缀(如当前时间戳),以确保新对象按字典顺序排在旧对象之后
- 除了使用nextMarker,我们还可以在下一个请求中使用最后一个对象的键本身作为标记
虽然这是AWS cli的文档,但我已经通过Java SDK验证了相同的行为。是否可以通过其他方式实现所需的行为?如果我们假设新对象总是在字典上更大(比如日志),我们能检测到新对象吗?
ListObjectsRequest request = new ListObjectsRequest().withBucketName(bucketName);
ObjectListing listing = null;
while((listing == null) || (request.getMarker() != null)) {
listing = s3Client.listObjects(request);
// do stuff with listing
request.setMarker(listing.getNextMarker()); //ALSO STORE MARKER FOR FUTURE USE
}