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.