Java: scrivi un InputStream su un file

1. Panoramica

In questo breve tutorial, illustreremo come scrivere un InputStream in un file , prima utilizzando Java semplice, poi Guava e infine la libreria Apache Commons IO.

Questo articolo fa parte del tutorial " Java - Back to Basic " qui su Baeldung.

2. Convertire utilizzando Plain Java

Cominciamo con la soluzione 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); }

Si noti che in questo esempio, il flusso di input ha dati noti e predeterminati, come un file su disco o un flusso in memoria. Per questo motivo, non è necessario eseguire alcun controllo dei limiti e possiamo, se la memoria lo consente, semplicemente leggerlo e scriverlo in una volta sola.

Se il flusso di input è collegato a un flusso in corso di dat a, ad esempio una risposta HTTP proveniente da una connessione in corso, la lettura dell'intero flusso una volta non è un'opzione. In tal caso, dobbiamo assicurarci di continuare a leggere fino a raggiungere la fine dello 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); }

Infine, ecco un altro semplice modo in cui possiamo usare Java 8 per fare la stessa operazione:

@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. Converti usando Guava

Successivamente, diamo un'occhiata a una soluzione basata su Guava più semplice:

@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. Convertire utilizzando Commons IO

E infine, una soluzione ancora più rapida 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); }

Ed ecco fatto: 3 modi rapidi per scrivere InputStream su un file.

L'implementazione di tutti questi esempi può essere trovata nel nostro progetto GitHub.