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

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

1. обзор

В этом кратком руководстве мы собираемся проиллюстрировать, какwrite an InputStream to a File - сначала с использованием простой Java, затем Guava и, наконец, библиотеки ввода-вывода Apache Commons.

Эта статья является частьюthe “Java – Back to Basic” tutorial здесь для примера.

Дальнейшее чтение:

Java - InputStream to Reader

Как преобразовать InputStream в Reader, используя Java, Guava и библиотеку Apache Commons IO.

Read more

Java - конвертировать файл в InputStream

Как открыть InputStream из файла Java - используя простую Java, Guava и библиотеку Apache Commons IO.

Read more

Java InputStream для байтового массива и ByteBuffer

Как преобразовать InputStream в байт [], используя обычный Java, Guava или Commons IO.

Read more

2. Преобразование с использованием простой Java

Начнем сthe Java solution:

@Test
public void whenConvertingToFile_thenCorrect()
  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");
    OutputStream outStream = new FileOutputStream(targetFile);
    outStream.write(buffer);
}

Обратите внимание, что в этом примере входной поток имеет известные и заранее определенные данные, такие как файл на диске или поток в памяти. Из-за этогоwe don’t need to do any bounds checking и мы можем - если позволяет память - просто прочитать его и записать за один раз.

Java - Write an Input Stream to a File

 

Если входной поток связан сongoing stream of data - например, HTTP-ответ, исходящий от текущего соединения, - то однократное чтение всего потока не является вариантом. В этом случае нам нужно убедиться, что мыkeep reading until we reach the end of the stream:

@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 в файл.