Автор оригинала: 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); }
Обратите внимание, что в этом примере входной поток содержит известные и заранее определенные данные, такие как файл на диске или поток в памяти. Из – за этого нам не нужно проверять границы , и мы можем – если память позволяет-просто прочитать его и записать за один раз.
Если входной поток связан с текущим потоком 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 .