Java InputStream byte Array és ByteBuffer

1. Áttekintés

Ebben a gyors bemutatóban megnézzük, hogyan lehet konvertálni egy InputStream a byte[] és ByteBuffer - először a sima Java, majd a Guava és a Commons IO használatával.

Ez a cikk a „Java - Vissza az alapokhoz” sorozat része, itt, Baeldungon.

2. Konvertálás byte Array-be

Nézzük meg, hogyan szerezzünk egy bájt tömböt egyszerű bemeneti adatfolyamokból. A bájt tömb fontos szempontja az indexelt (gyors) hozzáférést tesz lehetővé a memóriában tárolt minden 8 bites (bájtos) értékhez. Ezért manipulálhatja ezeket a bájtokat az egyes bitek vezérléséhez. Meg fogjuk vizsgálni, hogyan lehet átalakítani egy egyszerű bemeneti adatfolyamot a-ba byte[] - először a sima Java, majd a Guava és az Apache Commons IO használatával.

2.1. Konvertálás Sima Java használatával

Kezdjük egy Java megoldással, amely egy fix méretű adatfolyam kezelésére összpontosít:

@Test public void givenUsingPlainJava_whenConvertingAnInputStreamToAByteArray_thenCorrect () dobja az IOException-t {InputStream initialStream = new ByteArrayInputStream (új byte [] {0, 1, 2}); byte [] targetArray = új byte [kezdetiStream.available ()]; kezdetiStream.read (targetArray); }

Pufferelt adatfolyam esetén - ahol pufferelt folyamattal van dolgunk, és nem tudjuk az alapul szolgáló adatok pontos méretét, rugalmasabbá kell tennünk a megvalósítást:

@Test public void givenUsingPlainJavaOnUnknownSizeStream_whenConvertingAnInputStreamToAByteArray_thenCorrect () dob IOException {InputStream is = new ByteArrayInputStream (new byte [] {0, 1, 2}); // nem igazán ismeretlen ByteArrayOutputStream puffer = new ByteArrayOutputStream (); int nRead; bájt [] adatok = új bájt [1024]; míg (((nRead = van.olvasott (adat, 0, adat.hossz))! = -1) {puffer.írja (adat, 0, nRead); } buffer.flush (); byte [] byteArray = puffer.toByteArray (); }

A Java 9-től kezdve ugyanezt elérhetjük egy dedikált módszerrel is InputStream:

@Test public void givenUsingPlainJava9_whenConvertingAnInputStreamToAByteArray_thenCorrect () dobja az IOException-t {InputStream is = new ByteArrayInputStream (új byte [] {0, 1, 2}); bájt [] adatok = is.readAllBytes (); }

2.2. Konvertálás Guava használatával

Most nézzük meg az egyszerű Guava alapú megoldást - a kényelmes ByteStreams segédprogram osztály használatával:

@Test public void givenUsingGuava_whenConvertingAnInputStreamToAByteArray_thenCorrect () dobja az IOException {InputStream kezdetiStream = ByteSource.wrap (új byte [] {0, 1, 2}). OpenStream (); byte [] targetArray = ByteStreams.toByteArray (kezdeti adatfolyam); }

2.3. Konvertálás a Commons IO használatával

És végül - egy egyszerű megoldás az Apache Commons IO használatával:

@Test public void givenUsingCommonsIO_whenConvertingAnInputStreamToAByteArray_thenCorrect () dobja az IOException {ByteArrayInputStream initialStream = new ByteArrayInputStream (új byte [] {0, 1, 2}); byte [] targetArray = IOUtils.toByteArray (kezdeti adatfolyam); }

A módszer, a metódus IOUtils.toByteArray () a bemenetet belül pufferolja, tehát van nem kell használni a BufferedInputStream példa amikor pufferelésre van szükség.

3. Konvertálás erre: ByteBuffer

Most nézzük meg a ByteBuffer egy an InputStream. Ez hasznos, amikor gyors és közvetlen alacsony szintű I / O műveleteket kell végrehajtanunk a memóriában.

A fenti szakaszokkal megegyező megközelítéssel megvizsgáljuk, hogyan lehet konvertálni egy InputStream a ByteBuffer - először a sima Java, majd a Guava és a Commons IO használatával.

3.1. Konvertálás Sima Java használatával

Bájtfolyam esetén - tudjuk az alapul szolgáló adatok pontos méretét. Használjuk a A ByteArrayInputStream # elérhető módszer a bájtfolyam a ByteBuffer:

@Test public void givenUsingCoreClasses_whenByteArrayInputStreamToAByteBuffer_thenLengthMustMatch () dobja az IOException {byte [] input = new byte [] {0, 1, 2}; InputStream initialStream = new ByteArrayInputStream (input); ByteBuffer byteBuffer = ByteBuffer.allocate (3); while (kezdetiStream.available ()> 0) {byteBuffer.put ((byte) kezdetiStream.read ()); } assertEquals (byteBuffer.position (), input.length); }

3.2. Konvertálás Guava használatával

Most nézzünk meg egy egyszerű guava-alapú megoldást - a kényelmes használatával ByteStreams használati osztály:

@Test public void givenUsingGuava__whenByteArrayInputStreamToAByteBuffer_thenLengthMustMatch () dob IOException {InputStream initialStream = ByteSource .wrap (new byte [] {0, 1, 2}) .openStream (); byte [] targetArray = ByteStreams.toByteArray (kezdeti adatfolyam); ByteBuffer bufferByte = ByteBuffer.wrap (targetArray); while (bufferByte.hasRemaining ()) {bufferByte.get (); } assertEquals (bufferByte.position (), targetArray.length); }

Itt használunk egy darab ciklust a módszerrel hasRemaining hogy más módon mutassa be az összes bájt beolvasását a ByteBuffer. Ellenkező esetben az állítás kudarcot vallana, mert a ByteBuffer index pozíció nulla lesz.

3.3. Konvertálás a Commons IO használatával

És végül - az Apache Commons IO és a IOUtils osztály:

@Test public void givenUsingCommonsIo_whenByteArrayInputStreamToAByteBuffer_thenLengthMustMatch () dobja az IOException {byte [] input = new byte [] {0, 1, 2}; InputStream initialStream = new ByteArrayInputStream (input); ByteBuffer byteBuffer = ByteBuffer.allocate (3); ReadableByteChannel channel = newChannel (initialStream); IOUtils.readFully (csatorna, byteBuffer); assertEquals (byteBuffer.position (), input.length); }

4. Következtetés

Ez a cikk bemutatja a nyers bemeneti adatfolyam bájttömbbé és a ByteBuffer sima Java, Guava és Apache Commons IO használatával.

Mindezen példák megvalósítása megtalálható a GitHub projektünkben.