Jednostavni načini pisanja Java InputStreama u OutputStream

1. Pregled

U ovom brzom vodiču, naučit ćemo kako pisati Javu InputStream na Javu Izlazni tok. Prvo ćemo upotrijebiti osnovnu funkcionalnost s Java 8 i Java 9. Zatim ćemo pogledati nekoliko vanjskih knjižnica - Guava i Apache Commons IO knjižnica.

Uslužne metode koje pružaju Java 9, Guava i Apache Commons IO ne ispiru niti zatvaraju tokove. Dakle, trebat ćemo upravljati tim resursima pomoću pokušajte s resursima ili a konačno blok.

2. Korištenje Jave 8

Prvo ćemo započeti s izradom jednostavne metode pomoću Java Java za kopiranje sadržaja s InputStream prema Izlazni tok:

void copy (InputStream source, OutputStream target) baca IOException {byte [] buf = new byte [8192]; int dužina; while ((length = source.read (buf))> 0) {target.write (buf, 0, length); }}

Ovaj je kod prilično jednostavan - jednostavno čitamo neke bajtove, a zatim ih ispisujemo.

3. Korištenje Jave 9

Java 9 pruža uslužni način, InputStream.transferTo (), za ovaj zadatak.

Pogledajmo kako bismo koristili transferTo () metoda:

@Test javna praznina givenUsingJavaNine_whenCopyingInputStreamToOutputStream_thenCorrect () baca IOException {String InitialString = "Pozdrav svijetu!"; probajte (InputStream inputStream = novi ByteArrayInputStream (InitialString.getBytes ()); ByteArrayOutputStream targetStream = novi ByteArrayOutputStream ()) {inputStream.transferTo (targetStream); assertEquals (InitialString, novi String (targetStream.toByteArray ())); }}

Imajte na umu da kada radite s streamovima datoteka, učinkovitiji je za upotrebu Files.copy () nego transferTo () metoda.

4. Korištenje Guave

Dalje, pogledajmo kako bismo upotrijebite Guavinu korisnu metodu ByteStreams.copy ().

Morat ćemo uključiti ovisnost o guavi u naš pom.xml:

 com.google.guava guava 29,0-jre 

Stvorimo jednostavan testni slučaj da pokažemo kako bismo mogli koristiti ByteStreams za kopiranje podataka:

@Test javna praznina givenUsingGuava_whenCopyingInputStreamToOutputStream_thenCorrect () baca IOException {String InitialString = "Pozdrav svijetu!"; probajte (InputStream inputStream = novi ByteArrayInputStream (InitialString.getBytes ()); ByteArrayOutputStream targetStream = novi ByteArrayOutputStream ()) {ByteStreams.copy (inputStream, targetStream); assertEquals (InitialString, novi String (targetStream.toByteArray ())); }}

5. Korištenje Commons IO

Napokon, pogledajmo kako bismo koristite Commons IO IOUtils.copy () metoda za ovaj zadatak.

Naravno, morat ćemo dodati zajedničku ovisnost io pom.xml:

 commons-io commons-io 2.7 

Stvorimo jednostavan test pomoću IOUtils za kopiranje podataka iz ulaznog toka u izlazni tok:

@Test javna praznina givenUsingCommonsIO_whenCopyingInputStreamToOutputStream_thenCorrect () baca IOException {String InitialString = "Pozdrav svijetu!"; probajte (InputStream inputStream = novi ByteArrayInputStream (InitialString.getBytes ()); ByteArrayOutputStream targetStream = novi ByteArrayOutputStream ()) {IOUtils.copy (inputStream, targetStream); assertEquals (InitialString, novi String (targetStream.toByteArray ())); }}

Napomena: Commons IO pruža dodatne metode za rad s InputStreams i Izlazni toks. IOUtils.copyLarge () treba koristiti kad god je potrebno kopirati 2 GB ili više podataka.

6. Zaključak

U ovom smo članku istražili jednostavne načine za kopirajte podatke iz InputStream do an Izlazni tok.

Implementacija ovih primjera dostupna je na GitHub-u.


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