Java - Schrijf een InputStream naar een bestand

1. Overzicht

In deze korte tutorial laten we zien hoe Schrijf een InputStream naar een bestand - eerst gewoon Java gebruiken, dan Guava en tenslotte de Apache Commons IO-bibliotheek.

Dit artikel maakt deel uit van de “Java - Terug naar Basic”Tutorial hier op Baeldung.

2. Converteren met gewone Java

Laten we beginnen met de Java-oplossing:

@Test public void whenConvertingToFile_thenCorrect () gooit IOException {InputStream initialStream = nieuwe FileInputStream (nieuw bestand ("src / main / resources / sample.txt")); byte [] buffer = nieuwe byte [initialStream.available ()]; initialStream.read (buffer); Bestand targetFile = nieuw bestand ("src / main / resources / targetFile.tmp"); OutputStream outStream = nieuwe FileOutputStream (targetFile); outStream.write (buffer); }

Merk op dat in dit voorbeeld de invoerstroom bekende en vooraf bepaalde gegevens bevat, zoals een bestand op schijf of een stroom in het geheugen. Door dit, we hoeven geen grenzen te controleren en we kunnen - als het geheugen het toelaat - het gewoon in één keer lezen en schrijven.

Als de invoerstroom is gekoppeld aan een voortdurende stroom van data - bijvoorbeeld een HTTP-reactie afkomstig van een lopende verbinding - dan is het lezen van de hele stream één keer geen optie. In dat geval moeten we ervoor zorgen dat we blijf lezen tot we het einde van de stroom bereiken:

@Test openbare leegte whenConvertingInProgressToFile_thenCorrect () gooit IOException {InputStream initialStream = nieuwe FileInputStream (nieuw bestand ("src / main / resources / sample.txt")); Bestand targetFile = nieuw bestand ("src / main / resources / targetFile.tmp"); OutputStream outStream = nieuwe FileOutputStream (targetFile); byte [] buffer = nieuwe byte [8 * 1024]; int bytesRead; while ((bytesRead = initialStream.read (buffer))! = -1) {outStream.write (buffer, 0, bytesRead); } IOUtils.closeQuietly (initialStream); IOUtils.closeQuietly (outStream); }

Eindelijk, hier is nog een andere, eenvoudige manier waarop we Java 8 kunnen gebruiken om dezelfde bewerking uit te voeren:

@Test openbare leegte whenConvertingAnInProgressInputStreamToFile_thenCorrect2 () gooit IOException {InputStream initialStream = nieuwe FileInputStream (nieuw bestand ("src / main / resources / sample.txt")); Bestand targetFile = nieuw bestand ("src / main / resources / targetFile.tmp"); java.nio.file.Files.copy (initialStream, targetFile.toPath (), StandardCopyOption.REPLACE_EXISTING); IOUtils.closeQuietly (initialStream); }

3. Converteren met behulp van Guava

Vervolgens - laten we eens kijken naar een eenvoudigere op Guava gebaseerde oplossing:

@Test openbare leegte whenConvertingInputStreamToFile_thenCorrect3 () gooit IOException {InputStream initialStream = nieuwe FileInputStream (nieuw bestand ("src / main / resources / sample.txt")); byte [] buffer = nieuwe byte [initialStream.available ()]; initialStream.read (buffer); Bestand targetFile = nieuw bestand ("src / main / resources / targetFile.tmp"); Files.write (buffer, targetFile); }

4. Converteren met Commons IO

En tot slot - een nog snellere oplossing met Apache Commons IO:

@Test openbare leegte whenConvertingInputStreamToFile_thenCorrect4 () gooit IOException {InputStream initialStream = FileUtils.openInputStream (nieuw bestand ("src / main / resources / sample.txt")); Bestand targetFile = nieuw bestand ("src / main / resources / targetFile.tmp"); FileUtils.copyInputStreamToFile (initialStream, targetFile); }

En daar heb je het - 3 snelle manieren om het InputStream naar een bestand.

De implementatie van al deze voorbeelden is te vinden in ons GitHub-project.