Начиная с Java 7 (опубликовано в июле 2011 г.), есть лучший способ: Files.copy()
утилита из java.util.nio.file
.
Копирует все байты из входного потока в файл.
Таким образом, вам не нужно ни внешняя библиотека , ни прокруткаваш собственный цикл байтов .Ниже приведены два примера, каждый из которых использует входной поток из S3Object.getObjectContent()
.
InputStream in = s3Client.getObject("bucketName", "key").getObjectContent();
1) Запись в новый файл по указанному пути:
Files.copy(in, Paths.get("/my/path/file.jpg"));
2) Запись во временный файл в системном расположении tmp по умолчанию:
File tmp = File.createTempFile("s3test", "");
Files.copy(in, tmp.toPath(), StandardCopyOption.REPLACE_EXISTING);
(Без указания опции для замены существующего файла вы получите FileAlreadyExistsException
.)
Также обратите внимание, что getObjectContent()
Javadocs призывает вас закрыть входной поток :
Если вы получаете объект S3Object, вы должны закрытьэтот входной поток как можно скорее, потому что содержимое объекта не буферизуется в памяти и не передается напрямую из Amazon S3.Кроме того, отказ закрыть этот поток может привести к блокировке пула запросов.
Поэтому безопаснее всего обернуть все в try-catch-finally и выполнить in.close();
в блоке finally.
Выше предполагается, что вы используете официальный SDK от Amazon (aws-java-sdk-s3
).