Список всех объектов в AWS S3 с помощью Java SDK

Я использую следующий фрагмент кода для перечисления объектов в корзине.

objectListing = client.listObjects(bucketname);
do{
   for (S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) {
         System.out.printf(" - %s (size: %d)\n", objectSummary.getKey(), objectSummary.getSize());
        }
         objectListing=s3Client.listNextBatchOfObjects(objectListing);
  }while (objectListing.isTruncated());

Я не могу получить последнюю партию объектов. Я провел некоторое исследование по этому поводу, и партии сохраняются в списке. Но я не могу использовать список для сохранения всех объектов, поскольку существует миллион объектов, и это приведет к иногда проблема с памятью кучи.Как я могу получить все объекты.Спасибо !!!

Новый:

Я запускаю это:

    BasicAWSCredentials credentials = new BasicAWSCredentials("foo", "bar");
    client = AmazonS3ClientBuilder
    .standard()
    .withCredentials(new AWSStaticCredentialsProvider(credentials))
    .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration("http://localhost:" + port, null))
    .withPathStyleAccessEnabled(true)
    .withChunkedEncodingDisabled(true)
    .build();
    ObjectListing listing = client.listObjects( "bucketname");
    System.out.println("Listing size "+listing.getObjectSummaries().size());
    System.out.println("At 0 index "+ listing.getObjectSummaries().get(0).getKey());
    System.out.println("At 999 index "+ listing.getObjectSummaries().get(999).getKey());
    while (listing.isTruncated()) {
              System.out.println("-----------------------------------------------");
        listing = client.listNextBatchOfObjects(listing);
        System.out.println("Listing size "+listing.getObjectSummaries().size());
        System.out.println("At 0 index "+ listing.getObjectSummaries().get(0).getKey());
        System.out.println("At 999 index "+ listing.getObjectSummaries().get(1000).getKey());
}

Получаю следующий результат:

Listing size 1000
At 0 index folder1/a.gz
At 999 index folder1/b.gz
---------------------------------------------------------------
Listing size 1001
At 0 index folder1/b.gz
At 1000 index folder1/d.gz
---------------------------------------------------------------
Listing size 1001
At 0 index folder1/d.gz
At 1000 index folder1/e.gz
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
1 772
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Просто и понятно

ObjectListing listing = s3.listObjects( bucketName, prefix );
List<S3ObjectSummary> summaries = listing.getObjectSummaries();

while (listing.isTruncated()) {
   listing = s3.listNextBatchOfObjects (listing);
   summaries.addAll (listing.getObjectSummaries());
}  

Или же

ObjectListing listing = s3.listObjects( bucketName, prefix );
doSomeProcessing(listing);

while (listing.isTruncated()) {
   listing = s3.listNextBatchOfObjects (listing);
   doSomeProcessing(listing);
}  

Обновление:
В приведенном ниже комментарии к повторяющимся элементам я запустил код ниже

Yeah,I am getting objects but the 1000 and 1001 objects are repeating and so 2001 and 2002 objects are repeating and so on.How can i avoid this by second method @raevilman. Thank You

public static void main(String[] args) {
        int i=0;
        System.out.println("start");
        ObjectListing listing = s3Client.listObjects( "emr-logs");
        System.out.println("Listing size "+listing.getObjectSummaries().size());
        System.out.println("At 0 index "+ listing.getObjectSummaries().get(0).getKey());
        System.out.println("At 999 index "+ listing.getObjectSummaries().get(999).getKey());
        while (listing.isTruncated()) {
            if (i>3)break;
            System.out.println("======================================================================= = ");
            listing = s3Client.listNextBatchOfObjects(listing);
            System.out.println("Listing size "+listing.getObjectSummaries().size());
            System.out.println("At 0 index "+ listing.getObjectSummaries().get(0).getKey());
            System.out.println("At 999 index "+ listing.getObjectSummaries().get(999).getKey());
            i++;
        }
        System.out.println("end");
    }

Я получил следующие результаты без повторяющихся элементов

start
Listing size 1000
At 0 index j-10HD9DMBVVTJL/containers/application_1507189355052_0001/container_1507189355052_0001_01_000001/stderr.gz
At 999 index j-156WGS0LMKA2I/node/i-00085367e194fc02a/daemons/instance-state/instance-state.log-2017-11-16-05-15.gz
========================================================================
Listing size 1000
At 0 index j-156WGS0LMKA2I/node/i-00085367e194fc02a/daemons/instance-state/instance-state.log-2017-11-16-05-30.gz
At 999 index j-182UIXOOU8GZ6/node/i-061ffd1d1ae11da74/provision-node/0d1707a0-71dd-4dd5-a1dc-ab226ee2d150/stdout.gz
========================================================================
Listing size 1000
At 0 index j-182UIXOOU8GZ6/node/i-061ffd1d1ae11da74/provision-node/apps-phase/stderr.gz
At 999 index j-1BW9J554DDY15/containers/application_1521803257216_0002/container_1521803257216_0002_01_000002/stderr.gz
========================================================================
Listing size 1000
At 0 index j-1BW9J554DDY15/containers/application_1521803257216_0002/container_1521803257216_0002_01_000002/stdout.gz
At 999 index j-1EKRPTSEXCTB5/node/i-0576a3c452d00384b/applications/hadoop/steps/s-2B5LZ2PC741FD/controller.gz
========================================================================
Listing size 1000
At 0 index j-1EKRPTSEXCTB5/node/i-0576a3c452d00384b/applications/hadoop/steps/s-2B5LZ2PC741FD/stderr.gz
At 999 index j-1G6AYY5EMTR94/node/i-02363f6ac11c89135/daemons/instance-state/instance-state.log-2017-10-29-14-15.gz
end

Process finished with exit code 0

Список используется для сохранения сводок объектов каждый раз, когда вы запускаете, и все сохраняется в списке сводок. Я не могу использовать список, чтобы сэкономить миллионы миллионов @raevilman

Sachin RT 14.05.2018 14:57

ОК. В этом случае вы можете обрабатывать сводки внутри цикла while вместо того, чтобы добавлять их в список ....

raevilman 14.05.2018 16:01

Да, я получаю объекты, но объекты 1000 и 1001 повторяются, поэтому объекты 2001 и 2002 повторяются и т. д. Как я могу избежать этого вторым методом @raevilman. Спасибо

Sachin RT 15.05.2018 14:18

Я запустил код. Но не получил повторяющихся элементов. Обновил ответ. Пожалуйста, посмотрите и предложите, если необходимо, какие-либо изменения.

raevilman 16.05.2018 08:02

Я использовал ваш образец кода с моими учетными данными s3, хотя я получаю повторяющиеся элементы. Я не знаю почему. Будет ли разница в подключении AmazonS3 s3Client или что-то еще @raevilman Спасибо.

Sachin RT 16.05.2018 12:35

Можете ли вы поделиться снимком экрана с запущенным кодом и выводом?

raevilman 16.05.2018 12:57

Я заметил, что в вашем случае размер списка 1001 - это последующие запросы ...

raevilman 16.05.2018 14:46

пожалуйста, помогите ...... Я не знаю цель .withEndpointConfiguration (новый AwsClientBuilder.EndpointConfiguration ("localhost:" + порт, null))

raevilman 16.05.2018 14:47

AwsClientBuilder.EndpointConfiguration имеет два поля: EndpointConfiguration (String serviceEndpoint (example.com:port), String signedRegion). Почему размер составляет 1001 последующий запрос? @raevilman

Sachin RT 16.05.2018 14:55

Байт, в чем причина использования конфигурации конечной точки? Я использую withRegion вместо этого ..... о размере, странно, не знаю ....

raevilman 16.05.2018 15:29

Я сохраняю эту двойную звездочку, так как предыдущий пакет последний объект и следующий пакетный объект одинаковы и повторяются. Он переносит предыдущий пакетный объект в nextbatchlistofobjects, а затем выдает 1000 оттуда, включая последний объект последнего пакета @ raevilman. Конфигурация конечной точки заключается в доступе к определенному хосту .

Sachin RT 16.05.2018 15:35

Также, если вы получаете 1001 объект, то индекс 999 не возвращает последний ..... Вы подделали результат ? ..... Скриншот?

raevilman 16.05.2018 15:36

Хорошо, а насчет конфигурации конечной точки? Почему это вместо метода withRegion?

raevilman 16.05.2018 15:40

Я могу напечатать индекс 1000, но я не печатал, поскольку я только что запустил ur код @raevilman, чтобы показать, что он получает 1001, и чтобы показать, что он принимает последний пакетный объект. Конфигурация конечной точки заключается в доступе к определенному хосту с портом.

Sachin RT 16.05.2018 15:50

Другие вопросы по теме