Вопрос-ответ

Easy way to write contents of a Java InputStream to an OutputStream

Простой способ записать содержимое входного потока Java в выходной поток

Сегодня я был удивлен, обнаружив, что не смог найти ни одного простого способа записи содержимого InputStream в OutputStream an в Java. Очевидно, что код байтового буфера написать несложно, но я подозреваю, что мне просто не хватает чего-то, что сделало бы мою жизнь проще (и код понятнее).

Итак, учитывая InputStream in и an OutputStream out, есть ли более простой способ написать следующее?

byte[] buffer = new byte[1024];
int len = in.read(buffer);
while (len != -1) {
out.write(buffer, 0, len);
len = in.read(buffer);
}
Переведено автоматически
Ответ 1

Как упоминал WMR, org.apache.commons.io.IOUtils в Apache есть метод с именем copy(InputStream,OutputStream), который делает именно то, что вы ищете.

Итак, у вас есть:

InputStream in;
OutputStream out;
IOUtils.copy(in,out);
in.close();
out.close();

...в вашем коде.

Есть причина, по которой вы избегаетеIOUtils?

Ответ 2

Если вы используете Java 7, лучше всего использовать файлы (в стандартной библиотеке):

/* You can get Path from file also: file.toPath() */
Files.copy(InputStream in, Path target)
Files.copy(Path source, OutputStream out)

Редактировать: Конечно, это просто полезно, когда вы создаете один из InputStream или OutputStream из файла. Используйте file.toPath(), чтобы получить путь из файла.

Для записи в существующий файл (например, созданный с помощью File.createTempFile()) вам нужно передать REPLACE_EXISTING опцию копирования (в противном случае FileAlreadyExistsException выдается):

Files.copy(in, target, StandardCopyOption.REPLACE_EXISTING)
Ответ 3

Java 9

Начиная с Java 9, InputStream предоставляет вызываемый метод transferTo со следующей сигнатурой:

public long transferTo(OutputStream out) throws IOException

Как указано в документации, transferTo будет:


Считывает все байты из этого входного потока и записывает байты в данный выходной поток в порядке их чтения. При возврате этот входной поток будет находиться в конце потока. Этот метод не закрывает ни один поток.


Этот метод может бесконечно блокировать чтение из входного потока или запись в выходной поток. Поведение для случая, когда входной и / или выходной поток асинхронно закрывается или поток прерывается во время передачи, в значительной степени зависит от потока ввода и вывода и, следовательно, не определено


Итак, чтобы записать содержимое Java InputStream в OutputStream, вы можете написать:

input.transferTo(output);
Ответ 4

Я думаю, это сработает, но обязательно протестируйте это ... небольшое "улучшение", но это может немного сказаться на удобочитаемости.

byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
java