1. Información general
En este tutorial rápido, vamos a ilustrar cómo escribir un InputStream en un archivo , primero usando Java simple, luego Guava y finalmente la biblioteca IO de Apache Commons.
Este artículo es parte del tutorial " Java - Volver a lo básico " aquí en Baeldung.
2. Convertir utilizando Java simple
Comencemos con la solución de 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); }
Tenga en cuenta que en este ejemplo, el flujo de entrada tiene datos conocidos y predeterminados, como un archivo en el disco o un flujo en memoria. Debido a esto, no necesitamos hacer ninguna verificación de límites y podemos, si la memoria lo permite, simplemente leerlo y escribirlo de una vez.

Si el flujo de entrada está vinculado a un flujo continuo de datos , por ejemplo, una respuesta HTTP proveniente de una conexión en curso, entonces leer el flujo completo una vez no es una opción. En ese caso, debemos asegurarnos de seguir leyendo hasta que lleguemos al final de la secuencia :
@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); }
Finalmente, aquí hay otra forma simple en la que podemos usar Java 8 para hacer la misma operación:
@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. Convertir usando guayaba
A continuación, echemos un vistazo a una solución basada en guayaba más simple:
@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. Convertir usando Commons IO
Y finalmente, una solución aún más rápida con 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); }
Y ahí lo tiene: 3 formas rápidas de escribir InputStream en un archivo.
La implementación de todos estos ejemplos se puede encontrar en nuestro proyecto GitHub.