Gemakkelijke manieren om een ​​Java InputStream naar een OutputStream te schrijven

1. Overzicht

In deze korte tutorial, we gaan leren hoe we een Java moeten schrijven InputStream naar een Java OutputStream. We zullen eerst de kernfunctionaliteit van Java 8 en Java 9 gebruiken. Daarna kijken we naar een aantal externe bibliotheken: Guava en de Apache Commons IO-bibliotheek.

De hulpprogramma-methoden die door Java 9, Guava en Apache Commons IO worden geleverd, spoelen of sluiten de streams niet. We zullen deze bronnen dus moeten beheren met behulp van probeer-met-middelen of een Tenslotte blok.

2. Java 8 gebruiken

Eerst beginnen we met het maken van een eenvoudige methode met behulp van vanilla Java om de inhoud van het InputStream naar de OutputStream:

ongeldige kopie (InputStream-bron, OutputStream-doel) gooit IOException {byte [] buf = nieuwe byte [8192]; int lengte; while ((length = source.read (buf))> 0) {target.write (buf, 0, length); }}

Deze code is vrij eenvoudig - we lezen gewoon enkele bytes in en schrijven ze vervolgens uit.

3. Java 9 gebruiken

Java 9 biedt een hulpprogramma-methode, InputStream.transferTo (), voor deze taak.

Laten we eens kijken hoe we de Overzetten naar() methode:

@Test openbare leegte gegevenUsingJavaNine_whenCopyingInputStreamToOutputStream_thenCorrect () gooit IOException {String initialString = "Hallo wereld!"; probeer (InputStream inputStream = nieuwe ByteArrayInputStream (initialString.getBytes ()); ByteArrayOutputStream targetStream = nieuwe ByteArrayOutputStream ()) {inputStream.transferTo (targetStream); assertEquals (initialString, new String (targetStream.toByteArray ())); }}

Merk op dat bij het werken met bestandsstromen, het is efficiënter in gebruik Files.copy () dan de Overzetten naar() methode.

4. Guava gebruiken

Laten we vervolgens kijken hoe we dat zouden doen gebruik de hulpprogramma-methode van Guava ByteStreams.copy ().

We zullen de guave-afhankelijkheid moeten opnemen in onze pom.xml:

 com.google.guava guave 29.0-jre 

Laten we een eenvoudige testcase maken om te laten zien hoe we deze kunnen gebruiken ByteStreams om gegevens te kopiëren:

@Test openbare leegte gegevenUsingGuava_whenCopyingInputStreamToOutputStream_thenCorrect () gooit IOException {String initialString = "Hallo wereld!"; probeer (InputStream inputStream = nieuwe ByteArrayInputStream (initialString.getBytes ()); ByteArrayOutputStream targetStream = nieuwe ByteArrayOutputStream ()) {ByteStreams.copy (inputStream, targetStream); assertEquals (initialString, new String (targetStream.toByteArray ())); }}

5. Met behulp van Commons IO

Laten we tot slot eens kijken hoe we dat zouden doen gebruik de Commons IO IOUtils.copy () methode voor deze taak.

Natuurlijk moeten we de commons-io-afhankelijkheid toevoegen aan de pom.xml:

 commons-io commons-io 2.7 

Laten we een eenvoudige testcase maken met IOUtils om gegevens van de inputstroom naar de outputstroom te kopiëren:

@Test openbare leegte gegevenUsingCommonsIO_whenCopyingInputStreamToOutputStream_thenCorrect () gooit IOException {String initialString = "Hallo wereld!"; probeer (InputStream inputStream = nieuwe ByteArrayInputStream (initialString.getBytes ()); ByteArrayOutputStream targetStream = nieuwe ByteArrayOutputStream ()) {IOUtils.copy (inputStream, targetStream); assertEquals (initialString, new String (targetStream.toByteArray ())); }}

Opmerking: Commons IO biedt aanvullende methoden om mee te werken InputStreams en OutputStreams. IOUtils.copyLarge () moet worden gebruikt wanneer het nodig is om 2 GB of meer gegevens te kopiëren.

6. Conclusie

In dit artikel hebben we eenvoudige manieren onderzocht om kopieer gegevens van een InputStream aan een OutputStream.

De implementatie van deze voorbeelden is beschikbaar op GitHub.


$config[zx-auto] not found$config[zx-overlay] not found