2017-09-14 24 views
1

私はバケツにたくさんのキー(zip)を持っています。s3バケットから最後のX修正ファイルを取得する方法

最後に作成されたXキーだけをs3から要求します。

Java APIを使用しています。しかし、私は最終的に変更/作成される方法を見つけることができませんでした。

私たちは自分でリストをソートしましたが、それでも最後のXアイテムは取得しません。このバケツは膨大なものになる可能性があり、すべての結果を取得して並べ替えることは望ましくないため、問題があります。

public List<MyObject> getResults(int numberOfResults) { 
     ObjectListing listing = s3Client.listObjects(new ListObjectsRequest() 
       .withBucketName(bucketName) 
       .withMaxKeys(numberOfResults)); 
     List<S3ObjectSummary> list = listing.getObjectSummaries(); 

// our internal sorting logic: 

     List<MyObject> myObjects = list.stream().map(item -> 
       MyObject.builder().resultKey(item.getKey()).createdDate(item.getLastModified()).build()).sorted(Comparator.comparing(MyObject::getCreatedDate)) 
       .collect(Collectors.toList()); 
     return myObjects; 
    } 

+0

ファイルはどのように更新され、アップロードされますか?それは同じJavaアプリを通じてのみですか? – mostafazh

答えて

0

私はAwsがサーバー側でこれを行う方法を提供していないと思います。クライアント側のフィルタリングを使用できます。 CLIでこれを行うことができますaws s3api list-objects --bucket bucketName --query "sort_by(keys,LastModified)"

+0

クライアント側のフィルタリングを行うと、最終的にたくさんのファイルがある場合、メモリが不足する可能性があります。どのように私はJava経由でCLIを使用できますか? – rayman

+0

java ProcessBuilderを使用して、CLIコマンド 'ProcessBuilder pb = new ProcessBuilder(command);を呼び出すことができます。 プロセスp = pb.start(); InputStream is = p.getInputStream(); InputStreamReader isr =新しいInputStreamReader(あり); BufferedReader br = new BufferedReader(isr); while((line = br.readLine())!= null){ System.out.println(line); } ' –

関連する問題