Рубрики
Без рубрики

Java – Запись входного потока в файл

Как записать входной поток в файл – с помощью Java, Guava и библиотеки ввода-вывода Commons.

Автор оригинала: Eugen Paraschiv.

1. Обзор

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

Эта статья является частью учебника “Java – Back to Basic” здесь, на Baeldung.

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

Java – InputStream для чтения

Java – Преобразование файла в InputStream

Java InputStream в массив байтов и ByteBuffer

2. Преобразование С Помощью Простой Java

Давайте начнем с решения Java :

@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);
}

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

Java - Запись входного потока в файл

Если входной поток связан с текущим потоком dat a – например, ответ 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. Конвертируйте С Помощью Гуавы

Далее – давайте рассмотрим более простое решение на основе гуавы:

@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 .