Enkle måter å skrive en Java InputStream til en OutputStream

1. Oversikt

I denne raske opplæringen, vi skal lære å skrive en Java InputStream til en Java OutputStream. Vi bruker først kjernefunksjonalitet fra Java 8 og Java 9. Deretter ser vi på et par eksterne biblioteker - Guava og Apache Commons IO-biblioteket.

Verktøysmetodene som tilbys av Java 9, Guava og Apache Commons IO skyller eller lukker ikke strømmen. Så vi må administrere disse ressursene ved hjelp av prøv-med-ressurser eller a endelig blokkere.

2. Bruke Java 8

Først begynner vi med å lage en enkel metode ved hjelp av vanilje Java for å kopiere innholdet fra InputStream til OutputStream:

ugyldig kopi (InputStream-kilde, OutputStream-mål) kaster IOException {byte [] buf = ny byte [8192]; int lengde; mens ((lengde = kilde.lesning (buf))> 0) {target.write (buf, 0, lengde); }}

Denne koden er ganske grei - vi leser ganske enkelt inn noen byte og skriver dem ut.

3. Bruke Java 9

Java 9 gir en verktøymetode, InputStream.transferTo (), for denne oppgaven.

La oss se på hvordan vi vil bruke Overfør til() metode:

@Test offentlig ugyldighet givenUsingJavaNine_whenCopyingInputStreamToOutputStream_thenCorrect () kaster IOException {String initialString = "Hello World!"; prøv (InputStream inputStream = ny ByteArrayInputStream (initialString.getBytes ()); ByteArrayOutputStream targetStream = ny ByteArrayOutputStream ()) {inputStream.transferTo (targetStream); assertEquals (initialString, new String (targetStream.toByteArray ())); }}

Vær oppmerksom på at når du arbeider med filstrømmer, det er mer effektivt å bruke Files.copy () enn Overfør til() metode.

4. Bruke Guava

La oss deretter se på hvordan vi ville gjort bruk Guavas verktøymetode ByteStreams.copy ().

Vi må inkludere guava-avhengigheten i vår pom.xml:

 com.google.guava guava 29.0-jre 

La oss lage en enkel testtilfelle for å vise hvordan vi kan bruke ByteStreams å kopiere data:

@Test offentlig ugyldighet givenUsingGuava_whenCopyingInputStreamToOutputStream_thenCorrect () kaster IOException {String initialString = "Hello World!"; prøv (InputStream inputStream = ny ByteArrayInputStream (initialString.getBytes ()); ByteArrayOutputStream targetStream = ny ByteArrayOutputStream ()) {ByteStreams.copy (inputStream, targetStream); assertEquals (initialString, new String (targetStream.toByteArray ())); }}

5. Bruke Commons IO

Til slutt, la oss se på hvordan vi ville gjort bruk Commons IO IOUtils.copy () metode for denne oppgaven.

Selvfølgelig må vi legge til commons-io avhengighet til pom.xml:

 commons-io commons-io 2.7 

La oss lage en enkel testsak ved hjelp av IOUtils for å kopiere data fra inngangsstrømmen til utgangsstrømmen:

@Test offentlig ugyldig givenUsingCommonsIO_whenCopyingInputStreamToOutputStream_thenCorrect () kaster IOException {String initialString = "Hello World!"; prøv (InputStream inputStream = ny ByteArrayInputStream (initialString.getBytes ()); ByteArrayOutputStream targetStream = ny ByteArrayOutputStream ()) {IOUtils.copy (inputStream, targetStream); assertEquals (initialString, new String (targetStream.toByteArray ())); }}

Merk: Commons IO gir flere metoder for å jobbe med InputStreams og OutputStreams. IOUtils.copyLarge () bør brukes når det er nødvendig å kopiere 2 GB eller mer data.

6. Konklusjon

I denne artikkelen undersøkte vi enkle måter å kopiere data fra en InputStream til en OutputStream.

Implementeringen av disse eksemplene er tilgjengelig på GitHub.


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