Posted at

AWS SDK for Javaを使ってオブジェクト一覧、フォルダ一覧を習得

More than 3 years have passed since last update.

最近本格的にAWSを使い始めました。というわけで、基本的なAWS SDKの使い方のメモです。

やりたいことは件名の通り。

バケットの構成が以下のようになっている時(大文字がフォルダ、小文字がオブジェクトだとします)に、


  • A/


    • B/


      • C/

      • x

      • y



    • D/

    • z



  • E/

A以下のフォルダ一覧と、オブジェクト一覧を取得する場合の実装例。

ListObjectsRequestを使います。

AmazonS3 client = new AmazonS3Client(

new BasicAWSCredentials(
"accesskey",
"secret"));

ListObjectsRequest request = new ListObjectsRequest()
.withBucketName("mybucket")
.withPrefix("A/")
.withDelimiter("/");
ObjectListing list = client.listObjects(request);

// フォルダ一覧
List<String> folders = list.getCommonPrefixes();
System.out.println("folderList:");
folders.forEach(System.out::println);

// オブジェクト一覧
List<S3ObjectSummary> objects = list.getObjectSummaries();
System.out.println("objectList:");
objects.forEach(object -> System.out.println(object.getKey()));


出力結果

folderList

A/B/
A/D/
objectList:
A/
A/z

わかったことなど。

ListObjectsRequest のプレフィックスとして末尾にデリミタ('/')を指定しないと、指定したフォルダ以下のフォルダ、オブジェクトは取得できませんでした。

また、取得可能なものは、直下のフォルダ一覧だけで、2階層以上深いフォルダ・オブジェクトの一覧は1リクエストでは習得できない(?)のかもしれません。

getObjectSummariesで取得したオブジェクト一覧では、オブジェクトの他に、起点となったパス(今回は "A/" )も結果に含まれます。

ちなみに getSize() でサイズを取得すると、0が返ります(そのフォルダの総オブジェクトサイズではありません)。

あと、今回は使っていませんが、marker, maxKeysなどで取得対象のキーや件数を制限できるっぽいので、必要であれば設定しておくとよいと思われます。