Java InputStream to Byte Array og ByteBuffer

1. Oversikt

I denne raske opplæringen skal vi ta en titt på hvordan du konverterer en InputStream til en byte [] og ByteBuffer - Først bruker du vanlig Java, deretter bruker du Guava og Commons IO.

Denne artikkelen er en del av "Java - Back to Basic" -serien her på Baeldung.

2. Konverter til Byte Array

La oss se på å skaffe et byte-utvalg fra enkle inngangsstrømmer. Det viktige aspektet ved en byteoppstilling er at det muliggjør indeksert (rask) tilgang til hver 8-biters (en byte) verdi som er lagret i minnet. Derfor kan du manipulere disse bytene for å kontrollere hver bit. Vi skal ta en titt på hvordan du konverterer en enkel inngangsstrøm til en byte [] - Først bruker du vanlig Java, deretter bruker du Guava og Apache Commons IO.

2.1. Konverter ved hjelp av vanlig Java

La oss starte med en Java-løsning som fokuserer på å håndtere en strøm i fast størrelse:

@Test offentlig ugyldighet gittUsingPlainJava_whenConvertingAnInputStreamToAByteArray_thenCorrect () kaster IOException {InputStream initialStream = ny ByteArrayInputStream (ny byte [] {0, 1, 2}); byte [] targetArray = ny byte [initialStream.available ()]; initialStream.read (targetArray); }

I tilfelle av en bufret strøm - hvor vi har å gjøre med en bufret strøm og ikke vet nøyaktig størrelsen på de underliggende dataene, må vi gjøre implementeringen mer fleksibel:

@Test offentlig ugyldig givenUsingPlainJavaOnUnknownSizeStream_whenConvertingAnInputStreamToAByteArray_thenCorrect () kaster IOException {InputStream er = ny ByteArrayInputStream (ny byte [] {0, 1, 2}); // egentlig ikke ukjent ByteArrayOutputStream buffer = ny ByteArrayOutputStream (); int nLes; byte [] data = ny byte [1024]; mens ((nRead = is.read (data, 0, data.length))! = -1) {buffer.write (data, 0, nRead); } buffer.flush (); byte [] byteArray = buffer.toByteArray (); }

Fra og med Java 9, kan vi oppnå det samme med en dedikert metode på InputStream:

@Test offentlig ugyldighet givenUsingPlainJava9_whenConvertingAnInputStreamToAByteArray_thenCorrect () kaster IOException {InputStream er = ny ByteArrayInputStream (ny byte [] {0, 1, 2}); byte [] data = is.readAllBytes (); }

2.2. Konverter ved hjelp av Guava

La oss nå se på den enkle Guava-baserte løsningen - ved hjelp av den praktiske ByteStreams-verktøysklassen:

@Test offentlig ugyldighet givenUsingGuava_whenConvertingAnInputStreamToAByteArray_thenCorrect () kaster IOException {InputStream initialStream = ByteSource.wrap (ny byte [] {0, 1, 2}). OpenStream (); byte [] targetArray = ByteStreams.toByteArray (initialStream); }

2.3. Konverter ved hjelp av Commons IO

Og til slutt - en grei løsning ved bruk av Apache Commons IO:

@Test offentlig ugyldighet gittUsingCommonsIO_whenConvertingAnInputStreamToAByteArray_thenCorrect () kaster IOException {ByteArrayInputStream initialStream = ny ByteArrayInputStream (ny byte [] {0, 1, 2}); byte [] targetArray = IOUtils.toByteArray (initialStream); }

Metoden IOUtils.toByteArray () buffrer inngangen internt, så det er ikke nødvendig å bruke en BufferedInputStream forekomst når det er behov for buffering.

3. Konverter til ByteBuffer

La oss nå se på å skaffe en ByteBuffer fra en InputStream. Dette er nyttig når vi trenger å gjøre raske og direkte I / O-operasjoner på lavt nivå i minnet.

Ved å bruke samme tilnærming som avsnittene ovenfor, skal vi se på hvordan vi konverterer en InputStream til en ByteBuffer - Først bruker du vanlig Java, deretter bruker du Guava og Commons IO.

3.1. Konverter ved hjelp av vanlig Java

Når det gjelder en byte-strøm - vet vi den nøyaktige størrelsen på de underliggende dataene. La oss bruke ByteArrayInputStream # tilgjengelig metode for å lese byte-strømmen inn i en ByteBuffer:

@Test offentlig ugyldighet gittUsingCoreClasses_whenByteArrayInputStreamToAByteBuffer_thenLengthMustMatch () kaster IOException {byte [] input = ny byte [] {0, 1, 2}; InputStream initialStream = ny ByteArrayInputStream (input); ByteBuffer byteBuffer = ByteBuffer.allocate (3); mens (initialStream.available ()> 0) {byteBuffer.put ((byte) initialStream.read ()); } assertEquals (byteBuffer.position (), input.length); }

3.2. Konverter ved hjelp av Guava

La oss nå se på en enkel Guava-basert løsning - ved hjelp av det praktiske ByteStreams bruksklasse:

@Test offentlig ugyldighet givenUsingGuava__whenByteArrayInputStreamToAByteBuffer_thenLengthMustMatch () kaster IOException {InputStream initialStream = ByteSource .wrap (ny byte [] {0, 1, 2}) .openStream (); byte [] targetArray = ByteStreams.toByteArray (initialStream); ByteBuffer bufferByte = ByteBuffer.wrap (targetArray); while (bufferByte.hasRemaining ()) {bufferByte.get (); } assertEquals (bufferByte.position (), targetArray.length); }

Her bruker vi en while-løkke med metoden harResterende for å vise en annen måte å lese alle byte i ByteBuffer. Ellers ville påstanden mislykkes fordi ByteBuffer indeksposisjon vil være null.

3.3. Konverter ved hjelp av Commons IO

Og til slutt - ved hjelp av Apache Commons IO og IOUtils klasse:

@Test offentlig tomrom gittUsingCommonsIo_whenByteArrayInputStreamToAByteBuffer_thenLengthMustMatch () kaster IOException {byte [] input = ny byte [] {0, 1, 2}; InputStream initialStream = ny ByteArrayInputStream (input); ByteBuffer byteBuffer = ByteBuffer.allocate (3); ReadableByteChannel channel = newChannel (initialStream); IOUtils.readFully (kanal, byteBuffer); assertEquals (byteBuffer.position (), input.length); }

4. Konklusjon

Denne artikkelen illustrerte forskjellige måter å konvertere en rå inngangsstrøm til en byte-array og en ByteBuffer bruker vanlig Java, Guava og Apache Commons IO.

Implementeringen av alle disse eksemplene finner du i GitHub-prosjektet vårt.


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