Перейти к основному содержимому

Java — запись InputStream в файл

· 2 мин. чтения

1. Обзор

В этом кратком руководстве мы покажем, как записать InputStream в файл. Сначала мы будем использовать обычную Java, затем Guava и, наконец, библиотеку Apache Commons IO.

Эта статья является частью руководства « Java — Back to Basic » здесь, на ForEach.

2. Конвертируйте с помощью обычной Java

Начнем с решения Java :

@Test
public void whenConvertingToFile_thenCorrect() throws IOException {
Path path = Paths.get("src/test/resources/sample.txt");
byte[] buffer = java.nio.file.Files.readAllBytes(path);

File targetFile = new File("src/test/resources/targetFile.tmp");
OutputStream outStream = new FileOutputStream(targetFile);
outStream.write(buffer);

IOUtils.closeQuietly(outStream);
}

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

Если входной поток связан с текущим потоком данных, например, HTTP-ответ, поступающий от текущего соединения, то однократное чтение всего потока невозможно. В этом случае нам нужно убедиться, что мы продолжаем читать, пока не достигнем конца потока :

@Test
public void whenConvertingInProgressToFile_thenCorrect()
throws IOException {

InputStream initialStream = new FileInputStream(
new File("src/main/resources/sample.txt"));
File targetFile = new File("src/main/resources/targetFile.tmp");
OutputStream outStream = new FileOutputStream(targetFile);

byte[] buffer = new byte[8 * 1024];
int bytesRead;
while ((bytesRead = initialStream.read(buffer)) != -1) {
outStream.write(buffer, 0, bytesRead);
}
IOUtils.closeQuietly(initialStream);
IOUtils.closeQuietly(outStream);
}

Наконец, вот еще один простой способ использовать Java 8 для выполнения той же операции:

@Test
public void whenConvertingAnInProgressInputStreamToFile_thenCorrect2()
throws IOException {

InputStream initialStream = new FileInputStream(
new File("src/main/resources/sample.txt"));
File targetFile = new File("src/main/resources/targetFile.tmp");

java.nio.file.Files.copy(
initialStream,
targetFile.toPath(),
StandardCopyOption.REPLACE_EXISTING);

IOUtils.closeQuietly(initialStream);
}

3. Конвертировать с помощью гуавы

Далее давайте рассмотрим более простое решение на основе Guava:

@Test
public void whenConvertingInputStreamToFile_thenCorrect3()
throws IOException {

InputStream initialStream = new FileInputStream(
new File("src/main/resources/sample.txt"));
byte[] buffer = new byte[initialStream.available()];
initialStream.read(buffer);

File targetFile = new File("src/main/resources/targetFile.tmp");
Files.write(buffer, targetFile);
}

4. Преобразование с использованием Commons IO

Наконец, вот еще более быстрое решение с Apache Commons IO:

@Test
public void whenConvertingInputStreamToFile_thenCorrect4()
throws IOException {
InputStream initialStream = FileUtils.openInputStream
(new File("src/main/resources/sample.txt"));

File targetFile = new File("src/main/resources/targetFile.tmp");

FileUtils.copyInputStreamToFile(initialStream, targetFile);
}

И вот у нас есть 3 быстрых способа записи InputStream в файл.

Реализацию всех этих примеров можно найти в нашем проекте на GitHub .