Könnyű módszerek Java InputStream írásához OutputStream-be
1. Áttekintés
Ebben a gyors bemutatóban megtanuljuk, hogyan kell Java-t írni InputStream Java-ra OutputStream. Először a Java 8 és a Java 9 alapvető funkcióit használjuk. Ezután megnézünk néhány külső könyvtárat - a Guava és az Apache Commons IO könyvtárakat.
A Java 9, a Guava és az Apache Commons IO által biztosított segédprogramok nem ölik le vagy zárják le az adatfolyamokat. Tehát ezeket az erőforrásokat a használatával kell kezelnünk erőforrásokkal próbálkozzon vagy a végül Blokk.
2. A Java 8 használata
Először egy egyszerű módszer létrehozásával kezdjük a vanília Java használatával a tartalom másolását a InputStream hoz OutputStream:
void copy (InputStream forrás, OutputStream cél) dobja az IOException {byte [] buf = new byte [8192]; int hossza; while ((hossz = forrás.olvasott (buf))> 0) {target.write (buf, 0, hossz); }}
Ez a kód elég egyszerű - egyszerűen beolvassunk néhány bájtot, majd kiírjuk őket.
3. A Java 9 használata
A Java 9 egy segédprogram-módszert biztosít, InputStream.transferTo (), erre a feladatra.
Nézzük meg, hogyan használnánk a transferTo () módszer:
@Test public void givenUsingJavaNine_whenCopyingInputStreamToOutputStream_thenCorrect () dobja az IOException-t {String initialString = "Hello World!"; try (InputStream inputStream = new ByteArrayInputStream (initialString.getBytes ()); ByteArrayOutputStream targetStream = new ByteArrayOutputStream ()) {inputStream.transferTo (targetStream); assertEquals (initialString, új String (targetStream.toByteArray ())); }}
Ne feledje, hogy ha fájlfolyamokkal dolgozik, hatékonyabb használni Files.copy () mint a transferTo () módszer.
4. Guava használata
Ezután nézzük meg, hogyan tennénk használja Guava hasznossági módszerét ByteStreams.copy ().
Be kell építenünk a guava-függőséget pom.xml:
com.google.guava guava 29.0-jre
Készítsünk egy egyszerű tesztesetet, hogy bemutassuk, hogyan tudnánk felhasználni ByteStreams adatok másolása:
@Test public void givenUsingGuava_whenCopyingInputStreamToOutputStream_thenCorrect () dobja az IOException-t {String initialString = "Hello World!"; try (InputStream inputStream = new ByteArrayInputStream (initialString.getBytes ()); ByteArrayOutputStream targetStream = new ByteArrayOutputStream ()) {ByteStreams.copy (inputStream, targetStream); assertEquals (initialString, új String (targetStream.toByteArray ())); }}
5. A Commons IO használata
Végül nézzük meg, hogyan tennénk használja a Commons IO-t IOUtils.copy () módszer erre a feladatra.
Természetesen hozzá kell adnunk a commons-io függőséget a pom.xml:
commons-io commons-io 2.7
Hozzunk létre egy egyszerű tesztesetet a IOUtils adatok másolása a bemeneti adatfolyamból a kimeneti adatfolyamba:
@Test public void givenUsingCommonsIO_whenCopyingInputStreamToOutputStream_thenCorrect () dobja az IOException-t {String initialString = "Helló világ!"; try (InputStream inputStream = new ByteArrayInputStream (initialString.getBytes ()); ByteArrayOutputStream targetStream = new ByteArrayOutputStream ()) {IOUtils.copy (inputStream, targetStream); assertEquals (initialString, új String (targetStream.toByteArray ())); }}
Megjegyzés: A Commons IO további módszereket biztosít a munkához InputStreams és OutputStreams. IOUtils.copyLarge () akkor kell használni, amikor 2 GB vagy annál több adatot kell lemásolni.
6. Következtetés
Ebben a cikkben egyszerű módszereket tártunk fel másolja az adatokat egy InputStream egy OutputStream.
Ezeknek a példáknak a megvalósítása elérhető a GitHub oldalon.