Edited at

ListObjectsV2Request(AWS SDK for Java)でS3のファイル一覧を取得する

More than 1 year has passed since last update.


概要


  • ファイルの一覧を取得するにはListObjectsV2Requestを利用する



    • ListObjectsV2Requestは一回のリクエストですべての一覧を返さない場合がある



      • ListObjectsV2Result#isTruncatedtrueの場合はすべてのファイル一覧を取得できていない



        • ListObjectsV2Request#setContinuationTokenListObjectsV2Result#getNextContinuationTokenを渡して、再度取得する必要がある。








すべてのファイル一覧を取得するIterator

import com.amazonaws.services.s3.AmazonS3;

import com.amazonaws.services.s3.model.ListObjectsV2Request;
import com.amazonaws.services.s3.model.S3ObjectSummary;
import lombok.val;

import java.util.*;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;

class S3ObjectSummaryIterator implements Iterator<S3ObjectSummary> {

private final AmazonS3 client;
private final ListObjectsV2Request request;
private final Queue<S3ObjectSummary> summaries = new LinkedList<>();
private boolean isTruncated = false;

S3ObjectSummaryIterator(AmazonS3 client, ListObjectsV2Request request) {
this.client = client;
this.request = request;
fetch();
}

private void fetch() {
val result = this.client.listObjectsV2(this.request);
summaries.addAll(result.getObjectSummaries());
this.isTruncated = result.isTruncated();
if (result.isTruncated()) {
request.setContinuationToken(result.getNextContinuationToken());
}
}

@Override
public boolean hasNext() {
if (summaries.isEmpty() && isTruncated) {
fetch();
}
return !summaries.isEmpty();
}

@Override
public S3ObjectSummary next() {
return summaries.poll();
}

public static Stream<S3ObjectSummary> stream(AmazonS3 client, ListObjectsV2Request request) {
val iterator = new S3ObjectSummaryIterator(client, request);
return StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED), false);
}

}


参考