IOUtils.copy() с потоками ввода и вывода очень медленно

Как часть моего веб-сервиса, у меня есть хранилище изображений, которое извлекает изображение из Amazon S3 (хранилище данных), а затем возвращает его. Вот как выглядит метод, который делает это:

File getPicture(String path) throws IOException {
    File file = File.createTempFile(path, ".png");
    S3Object object = s3Client.getObject(new GetObjectRequest(bucketName, path));
    IOUtils.copy(object.getObjectContent(), new FileOutputStream(file));
    return file;
}

Проблема заключается в том, что получение ответа от службы занимает слишком много времени (для загрузки образа размером 3 МБ потребовалось 7,5 секунд). Я замечаю, что если я закомментирую строку IOUtils.copy(), время отклика будет значительно быстрее, поэтому именно этот метод должен вызывать эту задержку.

Я видел этот метод, используемый почти во всех современных примерах преобразования S3Object в файл, но мне кажется, что это уникальный случай. Я пропускаю трюк здесь?

Цени любую помощь!

1 ответ

Из документации AWS:

public S3Object getObject(GetObjectRequest getObjectRequest)

возвращенный объект AmazonS3 содержит прямой поток данных из HTTP-соединения. Базовое HTTP-соединение не может быть повторно использовано, пока пользователь не закончит чтение данных и не закроет поток.

public S3ObjectInputStream getObjectContent()

Примечание. Этот метод является простым средством получения и фактически не создает поток. Если вы извлекаете объект S3Object, вам следует как можно скорее закрыть этот входной поток, поскольку содержимое объекта не буферизуется в памяти и не передается непосредственно из Amazon S3.


Если вы удалите IOUtils.copy line, затем метод быстро завершается, потому что вы на самом деле не обрабатываете поток. Если файл большой, его загрузка займет некоторое время. Вы не сможете ничего с этим поделать, если не сможете лучше подключиться к сервисам AWS.

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