Nemme måder at skrive en Java InputStream til en OutputStream

1. Oversigt

I denne hurtige vejledning vi skal lære at skrive en Java InputStream til en Java OutputStream. Vi bruger først kernefunktionalitet fra Java 8 og Java 9. Derefter ser vi på et par eksterne biblioteker - Guava og Apache Commons IO-biblioteket.

Hjælpemetoderne, der leveres af Java 9, Guava og Apache Commons IO, skyller eller lukker ikke streams. Så vi bliver nødt til at administrere disse ressourcer ved hjælp af prøv med ressourcer eller a langt om længe blok.

2. Brug af Java 8

Først begynder vi med at oprette en enkel metode ved hjælp af vanille Java til at kopiere indholdet fra InputStream til OutputStream:

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

Denne kode er ret ligetil - vi læser simpelthen nogle bytes og skriver dem derefter ud.

3. Brug af Java 9

Java 9 giver en hjælpemetode, InputStream.transferTo (), til denne opgave.

Lad os se på, hvordan vi bruger Overfør til() metode:

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

Bemærk, at når du arbejder med filstrømme, det er mere effektivt at bruge Files.copy () end det Overfør til() metode.

4. Brug af Guava

Lad os derefter se på, hvordan vi ville brug Guavas hjælpemetode ByteStreams.copy ().

Vi bliver nødt til at medtage guava-afhængighed i vores pom.xml:

 com.google.guava guava 29.0-jre 

Lad os oprette en simpel test case for at vise, hvordan vi kunne bruge ByteStreams at kopiere data:

@Test offentlig ugyldighed 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. Brug af Commons IO

Lad os endelig se på, hvordan vi ville brug Commons IO IOUtils.copy () metode til denne opgave.

Selvfølgelig skal vi tilføje commons-io afhængighed til pom.xml:

 commons-io commons-io 2.7 

Lad os oprette en simpel test sag ved hjælp af IOUtils for at kopiere data fra inputstrømmen til outputstrømmen:

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

Bemærk: Commons IO giver yderligere metoder til at arbejde med InputStreams og OutputStreams. IOUtils.copyLarge () skal bruges, når det er nødvendigt at kopiere 2 GB eller mere af data.

6. Konklusion

I denne artikel udforskede vi enkle måder at kopiere data fra en InputStream til en OutputStream.

Implementeringen af ​​disse eksempler er tilgængelig på GitHub.