Не все байты были прочитаны из S3ObjectInputStream, прерывая соединение HTTP ПРЕДУПРЕЖДЕНИЕ - PullRequest
0 голосов
/ 23 марта 2019

Я пытаюсь прочитать очень большой файл (почти 1 ГБ) с S3.Однако getobject не может прочитать файл с ошибкой

ПРЕДУПРЕЖДЕНИЕ: не все байты были прочитаны из S3ObjectInputStream, прерывая HTTP-соединение.Это, вероятно, ошибка и может привести к неоптимальному поведению.Запрашивайте только те байты, которые вам нужны, через ранжированный GET или сливайте входной поток после использования.

Я проверил несколько сообщений и обнаружил, что s3ObjectInputStream.abort () может решить проблему.Но это все равно не помогает.

    S3Object sourceS3Object = null;
    S3ObjectInputStream s3ObjectInputStream=null;
    InputStream reader = null;
    ObjectMetadata metadata = null;
    int retries = 10;

    while (retries > 0) {
        try {
            sourceS3Object = sourceS3Client.getObject(sourceS3Uri.getBucket(), sourceS3Uri.getKey());
            s3ObjectInputStream = sourceS3Object.getObjectContent();
            reader = new BufferedInputStream(s3ObjectInputStream);
        } catch (Exception readingException) {
            retries--;
            System.out.println(readingException);
            System.out.println(readingException.getStackTrace().toString());
            readingException.printStackTrace();

            if (s3ObjectInputStream != null) {
                s3ObjectInputStream.abort();
            }
            sourceS3Object = sourceS3Client.getObject(sourceS3Uri.getBucket(), sourceS3Uri.getKey());
            s3ObjectInputStream = sourceS3Object.getObjectContent();
        } finally {
            if (retries == 0) {
                System.out.println("Out of retries");
            }
        }
    }

Копирование выполняется успешно для файлов меньшего размера, но для больших файлов оно выдает мне это предупреждение

1 Ответ

0 голосов
/ 25 марта 2019

В предупреждении упоминается, что файл закрыт без чтения всего файла.В вашем коде упоминается, что

 if (s3ObjectInputStream != null) {
                s3ObjectInputStream.abort();
            }

s3ObjectInputstream хранит содержимое файла и прерывается без чтения всего файла.Так что код должен быть:

if (s3ObjectInputStream == null) {
                s3ObjectInputStream.abort();
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...