Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用AWS Java SDK获取查询为s3api的对象列表?_Java_Amazon Web Services_Amazon S3_Aws Sdk - Fatal编程技术网

如何使用AWS Java SDK获取查询为s3api的对象列表?

如何使用AWS Java SDK获取查询为s3api的对象列表?,java,amazon-web-services,amazon-s3,aws-sdk,Java,Amazon Web Services,Amazon S3,Aws Sdk,我正在使用AWS java SDK进行开发。我想得到一个对象列表,在上次修改日期之前有一个类似过滤器的过滤器。我可以在s3api上看到这个特性,如下所示 aws s3api列出对象 --bucket“myS3 BucketName” --查询“内容[?LastModified>=`2018-02-01`.{Key:Key,Size:Size,LastModified:LastModified}” --最多项目10“ 我在Java SDK中找不到类似的解决方案。如何使用Java SDK完成这项工

我正在使用AWS java SDK进行开发。我想得到一个对象列表,在上次修改日期之前有一个类似过滤器的过滤器。我可以在s3api上看到这个特性,如下所示

aws s3api列出对象
--bucket“myS3 BucketName”
--查询“内容[?LastModified>=`2018-02-01`.{Key:Key,Size:Size,LastModified:LastModified}”
--最多项目10“
我在Java SDK中找不到类似的解决方案。如何使用Java SDK完成这项工作?

使用AWS SDK for Java,我创建了以下实用程序方法:

/**
 * Gets S3 objects that reside in a specific bucket and whose keys conform to the 
 * specified prefix using v2 of the AWS Java SDK.
 * <br><br>
 * The objects returned will have a last-modified date between {@code start} and 
 * {@code end}.
 * <br><br>
 * Any objects that have been modified outside of the specified date-time range will 
 * not be returned.
 *
 * @param s3Client The v2 AWS S3 client used to make the request to S3.
 * @param bucket   The bucket where the S3 objects are located.
 * @param prefix   The common prefix that the keys of the S3 objects must conform to.
 * @param start    The objects returned will have been modified after this instant.
 * @param end      The objects returned will have been modified before this instant.
 * @return A {@link Stream} of {@link S3Object} objects.
 */
public static Stream<S3Object> getObjects(S3Client s3Client, String bucket, 
                                          String prefix, Instant start, 
                                          Instant end) {
    return s3Client.listObjectsV2Paginator(builder -> builder.bucket(bucket)
                   .prefix(prefix).build())
            .stream()
            .map(ListObjectsV2Response::contents)
            .flatMap(List::stream)
            .filter(s3Object -> {
                Instant lastModified = s3Object.lastModified();
                return !start.isAfter(lastModified) && !end.isBefore(lastModified);
            });
}
/**
*获取驻留在特定bucket中且其键符合
*使用AWS Java SDK的v2指定前缀。
*

*返回的对象的最后修改日期将介于{@code start}和{@code start}之间 *{@code end}。 *

*在指定日期时间范围之外修改的任何对象都将被删除 *不可退还。 * *@param s3Client用于向S3发出请求的v2 AWS S3客户端。 *@param bucket S3对象所在的bucket。 *@param prefix S3对象的键必须符合的公共前缀。 *@param start返回的对象在此瞬间之后将被修改。 *@param end返回的对象在此瞬间之前已被修改。 *@返回{@link S3Object}对象的{@link Stream}。 */ 公共静态流getObjects(S3Client、S3Client、字符串bucket、, 字符串前缀,即时开始, 即时结束){ 返回s3Client.listObjectsV2Paginator(builder->builder.bucket(bucket) .prefix(prefix.build()) .stream() .map(ListObjectsV2Response::contents) .flatMap(列表::流) .过滤器(s3Object->{ Instant lastModified=s3Object.lastModified(); return!start.isAfter(lastModified)和&!end.isBefore(lastModified); }); }
以下代码在逻辑上与您的示例等效:

S3Client s3Client = S3Client.create();
String bucket = "myS3-BucketName";
Instant before = Instant.parse("2018-02-01T00:00:00Z");
Instant after = Instant.MAX;

Stream<S3Object> firstTenObjects = 
    getObjects(s3Client, bucket, "", before, after).limit(10);
S3Client S3Client=S3Client.create();
String bucket=“myS3 BucketName”;
前瞬间=瞬间解析(“2018-02-01T00:00:00Z”);
瞬间后=瞬间最大值;
流对象=
getObjects(s3Client,bucket,“,before,after).limit(10);
您可以使用以下方法从
流中的每个
S3Object
获取要查找的数据:


Hi@jacob-g,谢谢你的解决方案。有一件事我想确认一下这个方法是否在本地过滤?@RayChen是的;从我所看到的,AWS Java SDK不支持远程过滤,但它不应该太贵。Hi@jacob-g,我们改用S3通知+Lambda,因为我们有很多对象。谢谢这是你的解决方案。