Java - Ecrire un InputStream dans un fichier

1. Vue d'ensemble

Dans ce rapide tutoriel, nous allons illustrer comment écrire un InputStream dans un fichier - d'abord en utilisant Java brut, puis Guava et enfin la bibliothèque Apache Commons IO.

Cet article fait partie du didacticiel « Java - Back to Basic » ici sur Baeldung.

2. Conversion à l'aide de Java brut

Commençons par la solution 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); }

Notez que dans cet exemple, le flux d'entrée a des données connues et prédéterminées, telles qu'un fichier sur disque ou un flux en mémoire. Pour cette raison, nous n'avons pas besoin de vérifier les limites et nous pouvons - si la mémoire le permet - simplement le lire et l'écrire en une seule fois.

Si le flux d'entrée est lié à un flux continu de données a - par exemple, une réponse HTTP provenant d'une connexion en cours - alors la lecture du flux entier une fois n'est pas une option. Dans ce cas, nous devons nous assurer de continuer à lire jusqu'à ce que nous atteignions la fin du flux :

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

Enfin, voici encore un autre moyen simple d'utiliser Java 8 pour effectuer la même opération:

@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 à l'aide de la goyave

Ensuite - jetons un coup d'œil à une solution plus simple basée sur 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. Conversion à l'aide de Commons IO

Et enfin - une solution encore plus rapide avec 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); }

Et là vous l'avez - 3 façons rapides d'écrire le InputStream dans un fichier.

L'implémentation de tous ces exemples se trouve dans notre projet GitHub.