Jednoduché spôsoby zápisu Java InputStream do OutputStream

1. Prehľad

V tomto rýchlom návode sa naučíme písať Javu InputStream na Javu OutputStream. Najskôr použijeme základné funkcie z prostredia Java 8 a Java 9. Potom sa pozrieme na niekoľko externých knižníc - Guava a knižnica Apache Commons IO.

Metódy obslužného programu poskytované programami Java 9, Guava a Apache Commons IO nevyplachujú ani nezatvárajú prúdy. Budeme teda musieť tieto zdroje spravovať pomocou vyskúšajte zdroje alebo a konečne blokovať.

2. Používanie Java 8

Najprv začneme vytvorením jednoduchej metódy pomocou vanilkovej Javy na kopírovanie obsahu z InputStream do OutputStream:

void copy (zdroj InputStream, cieľ OutputStream) vyvolá IOException {byte [] buf = nový bajt [8192]; int dĺžka; while ((length = source.read (buf))> 0) {target.write (buf, 0, length); }}

Tento kód je celkom jednoduchý - jednoducho čítame v niektorých bytoch a potom ich vypíšeme.

3. Používanie Java 9

Java 9 poskytuje obslužnú metódu, InputStream.transferTo (), pre túto úlohu.

Pozrime sa, ako by sme použili transferTo () metóda:

@Test public void givenUsingJavaNine_whenCopyingInputStreamToOutputStream_thenCorrect () vyvolá IOException {String initialString = "Hello World!"; try (InputStream inputStream = new ByteArrayInputStream (initialString.getBytes ()); ByteArrayOutputStream targetStream = new ByteArrayOutputStream ()) {inputStream.transferTo (targetStream); assertEquals (initialString, new String (targetStream.toByteArray ())); }}

Upozorňujeme, že pri práci s prúdmi súborov je efektívnejšie používať Files.copy () potom transferTo () metóda.

4. Používanie guavy

Ďalej sa pozrime, ako by sme postupovali použite metódu Guava ByteStreams.copy ().

Budeme musieť zahrnúť závislosť na guave do nášho pom.xml:

 com.google.guava guava 29.0-jre 

Vytvorme jednoduchý testovací prípad, ktorý nám ukáže, ako by sme mohli použiť ByteStreams kopírovať údaje:

@Test public void givenUsingGuava_whenCopyingInputStreamToOutputStream_thenCorrect () vyvolá IOException {String initialString = "Hello World!"; try (InputStream inputStream = new ByteArrayInputStream (initialString.getBytes ()); ByteArrayOutputStream targetStream = new ByteArrayOutputStream ()) {ByteStreams.copy (inputStream, targetStream); assertEquals (initialString, new String (targetStream.toByteArray ())); }}

5. Používanie Commons IO

Na záver sa pozrime, ako by sme postupovali použite Commons IO IOUtils.copy () metóda pre túto úlohu.

Samozrejme, budeme musieť pridať závislosť commons-io na pom.xml:

 commons-io commons-io 2.7 

Vytvorme jednoduchý testovací prípad pomocou IOUtils na kopírovanie údajov zo vstupného toku do výstupného toku:

@Test public void givenUsingCommonsIO_whenCopyingInputStreamToOutputStream_thenCorrect () vyvolá IOException {String initialString = "Hello World!"; try (InputStream inputStream = new ByteArrayInputStream (initialString.getBytes ()); ByteArrayOutputStream targetStream = new ByteArrayOutputStream ()) {IOUtils.copy (inputStream, targetStream); assertEquals (initialString, new String (targetStream.toByteArray ())); }}

Poznámka: Commons IO poskytuje ďalšie metódy práce s InputStreams a OutputStreams. IOUtils.copyLarge () by sa mali používať vždy, keď je potrebné skopírovať 2 GB alebo viac údajov.

6. Záver

V tomto článku sme preskúmali jednoduché spôsoby, ako kopírovať údaje z InputStream do an OutputStream.

Implementácia týchto príkladov je k dispozícii na GitHub.


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