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

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


概要

  • ファイルの一覧を取得するには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); 
    } 
 
} 


参考

コメント

このブログの人気の投稿

投稿時間:2021-06-17 05:05:34 RSSフィード2021-06-17 05:00 分まとめ(1274件)

投稿時間:2021-06-20 02:06:12 RSSフィード2021-06-20 02:00 分まとめ(3871件)

投稿時間:2020-12-01 09:41:49 RSSフィード2020-12-01 09:00 分まとめ(69件)