“递归”获取S3子文件夹中的所有文件

Wom*_*ode -1 java amazon-s3 amazon-web-services

我需要帮助以“递归”方式获取s3中的文件:

例如,我的s​​3结构如下:

My-bucket/2018/06/05/10/file1.json

My-bucket/2018/06/05/11/file2.json

My-bucket/2018/06/05/12/file3.json

My-bucket/2018/06/05/13/file5.json

My-bucket/2018/06/05/14/file4.json

My-bucket/2018/06/05/15/file6.json
Run Code Online (Sandbox Code Playgroud)

我需要获取给定存储桶的所有文件名的文件路径:

我尝试了以下方法,但对我没有用(返回的不是完整路径):

public  List<String> getObjectsListFromFolder4(String bucketName, String keyPrefix) {
        List<String> paths = new ArrayList<String>();
        String delimiter = "/";
        if (keyPrefix != null && !keyPrefix.isEmpty() && !keyPrefix.endsWith(delimiter)) {
            keyPrefix += delimiter;
        }

        ListObjectsRequest listObjectRequest = new ListObjectsRequest().withBucketName(bucketName)
                .withPrefix(keyPrefix).withDelimiter(delimiter);

        ObjectListing objectListing;
        do {
            objectListing = s3Client.listObjects(listObjectRequest);
            paths.addAll(objectListing.getCommonPrefixes());
            listObjectRequest.setMarker(objectListing.getNextMarker());
        } while (objectListing.isTruncated());
        return paths;
    }
Run Code Online (Sandbox Code Playgroud)

mad*_*ead 5

有一个新的实用程序类,S3Objects它提供了一种在“ foreach”语句中迭代Amazon S3对象的简便方法。使用其withPrefix方法,然后对其进行迭代。您也可以使用过滤器和流。

这是一个示例(科特琳):

val s3 = AmazonS3ClientBuilder
    .standard()
    .withCredentials(EnvironmentVariableCredentialsProvider())
    .build()

S3Objects
    .withPrefix(s3, bucket, folder)
    .filter { s3ObjectSummary ->
        s3ObjectSummary.key.endsWith(".gz")
    }
    .parallelStream()
    .forEach { s3ObjectSummary ->
        CSVParser.parse(
            GZIPInputStream(s3.getObject(s3ObjectSummary.bucketName, s3ObjectSummary.key).objectContent),
            StandardCharsets.UTF_8,
            CSVFormat.DEFAULT
        ).use { csvParser ->
            …
        }
    }
Run Code Online (Sandbox Code Playgroud)