{"id":9884,"date":"2020-02-26T09:01:11","date_gmt":"2020-02-26T08:01:11","guid":{"rendered":"https:\/\/www.happycoders.eu\/?p=9884"},"modified":"2025-06-12T08:37:33","modified_gmt":"2025-06-12T06:37:33","slug":"bytebuffer-flip-compact","status":"publish","type":"post","link":"https:\/\/www.happycoders.eu\/de\/java\/bytebuffer-flip-compact\/","title":{"rendered":"Java ByteBuffer: Wie funktionieren flip() und compact()?"},"content":{"rendered":"\n<p>In diesem Artikel zeige ich dir anhand eines Beispiels, wie der Java <code>ByteBuffer<\/code> funktioniert und was die Methoden <code>flip()<\/code> und <code>compact()<\/code> genau machen.<\/p>\n\n\n\n<p>Folgende Fragen wird der Artikel beantworten:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Was ist ein <code>ByteBuffer<\/code>, und wof\u00fcr ben\u00f6tigt man ihn?<\/li>\n\n\n\n<li>Wie erzeugt man einen <code>ByteBuffer<\/code>?<\/li>\n\n\n\n<li>Was bedeuten die Werte <code>position<\/code>, <code>limit<\/code> und <code>capacity<\/code>?<\/li>\n\n\n\n<li>Wie schreibt man in den ByteBuffer, wie liest man daraus?<\/li>\n\n\n\n<li><span style=\"font-size: 1rem;\">Was genau machen die Methoden <\/span><code>flip()<\/code><span style=\"font-size: 1rem;\"> und <\/span><code>compact()<\/code><span style=\"font-size: 1rem;\">?<\/span><\/li>\n<\/ul>\n\n\n\n<p>Los geht's!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"was-ist-ein-bytebuffer-und-wofuer-benoetigt-man-ihn\">Was ist ein ByteBuffer, und wof\u00fcr ben\u00f6tigt man ihn?<\/h2>\n\n\n\n<p>Einen <code>ByteBuffer<\/code> ben\u00f6tigst du, um mit einem sogenannten \"Channel\" Daten in eine Datei, einen Socket oder eine andere I\/O-Komponente zu schreiben bzw. daraus zu lesen.<\/p>\n\n\n\n<p>(In diesem Artikel geht es vorranging um den <code>ByteBuffer<\/code> selbst. Wie du mit dem <code>ByteBuffer<\/code> und einem <code>FileChannel<\/code> Dateien schreibst und liest, erf\u00e4hrst du im <a href=\"https:\/\/www.happycoders.eu\/de\/java\/filechannel-memory-mapped-io-locks\/\">FileChannel-Artikel des Dateien-Tutorials<\/a>.)<\/p>\n\n\n\n<p>Ein <code>ByteBuffer<\/code> ist ein Wrapper um ein Byte-Array und bietet Methoden zum komfortablen Schreiben in und Lesen aus dem Byte-Array. Der <code>ByteBuffer<\/code> speichert intern die Schreib-\/Lese-Position und ein sogenanntes \"Limit\".<\/p>\n\n\n\n<p>Was das genau bedeutet, erf\u00e4hrst du im folgenden Beispiel \u2013 Schritt-f\u00fcr-Schritt.<\/p>\n\n\n\n<p>Den im Zuge dieses Artikels geschriebenen Programmcode findest du in diesem <a rel=\"noopener\" href=\"https:\/\/github.com\/SvenWoltmann\/bytebuffer-demo\" target=\"_blank\">GitHub-Repository<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"einen-bytebuffer-erzeugen\">Einen ByteBuffer erzeugen<\/h2>\n\n\n\n<p>Als erstes muss ein <code>ByteBuffer<\/code> mit einer vorgegebenen Gr\u00f6\u00dfe (englisch: \"capacity\") angelegt werden. Hierf\u00fcr gibt es zwei Methoden:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>ByteBuffer.allocate(int capacity)<\/code><\/li>\n\n\n\n<li><code>ByteBuffer.allocateDirect(int capacity)<\/code><\/li>\n<\/ul>\n\n\n\n<p>Mit dem Parameter <code>capacity<\/code> wird die Gr\u00f6\u00dfe des Buffers in Byte angegeben.<\/p>\n\n\n\n<p>Die Methode <code>allocate()<\/code> legt den Buffer im Java Heap Memory an, wo er nach der Verwendung durch den Garbage Collector wieder entfernt wird.<\/p>\n\n\n\n<p><code>allocateDirect()<\/code> hingegen legt den Buffer im nativen Speicher an, also au\u00dferhalb des Heaps. Das hat den Vorteil, dass Schreib- und Leseoperationen schneller ausgef\u00fchrt werden, da die entsprechenden Betriebssystem-Operationen direkt auf diesen Speicherbereich zugreifen k\u00f6nnen und die Daten nicht zun\u00e4chst zwischen dem Java-Heap und dem Betriebssystem ausgetauscht werden m\u00fcssen. Der Nachteil dieser Methode sind h\u00f6here Allokations- und Deallokationskosten.<\/p>\n\n\n\n<div class=\"wp-block-uagb-info-box uagb-block-76088612 uagb-infobox__content-wrap  uagb-infobox-icon-left uagb-infobox-left uagb-infobox-stacked-mobile uagb-infobox-image-valign-top hc-infobox\"><div class=\"uagb-ifb-icon-wrap\"><svg xmlns=\"https:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\"><path d=\"M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM256 128c17.67 0 32 14.33 32 32c0 17.67-14.33 32-32 32S224 177.7 224 160C224 142.3 238.3 128 256 128zM296 384h-80C202.8 384 192 373.3 192 360s10.75-24 24-24h16v-64H224c-13.25 0-24-10.75-24-24S210.8 224 224 224h32c13.25 0 24 10.75 24 24v88h16c13.25 0 24 10.75 24 24S309.3 384 296 384z\"><\/path><\/svg><\/div><div class=\"uagb-ifb-content\"><div class=\"uagb-ifb-title-wrap\"><\/div><p class=\"uagb-ifb-desc\"><code>ByteBuffer<\/code> wurde in Java 1.4 eingef\u00fchrt, also im Jahr 2002. Kapazit\u00e4t, Limit und Position werden in <code>int<\/code>-Variablen gespeichert, weshalb die maximale Kapazit\u00e4t eines ByteBuffers nur 2 GB betr\u00e4gt. Um einen gr\u00f6\u00dferen Off-Heap-Speicherblock zu verwalten, kannst du die in <a href=\"\/de\/java\/java-22-features\/\">Java 22<\/a> fertiggestellte <a href=\"\/de\/java\/foreign-function-memory-api\/\">Foreign Function and Memory API (FFM API)<\/a> einsetzen.<\/p><\/div><\/div>\n\n\n\n<p>Wir legen wie folgt einen <code>ByteBuffer<\/code> mit einer Gr\u00f6\u00dfe von 1.000 Bytes an:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">var<\/span> buffer = ByteBuffer.allocate(<span class=\"hljs-number\">1000<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Danach schauen wir uns die Kennzahlen des Buffers an \u2013 n\u00e4mlich  <code>position<\/code>, <code>limit<\/code> und <code>capacity<\/code>.<\/p>\n\n\n\n<p>Da wir diese Kennzahlen im Verlauf des Beispiels wiederholt ausgeben werden, legen wir daf\u00fcr eine <code>printMetrics<\/code>-Methode an:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">printMetrics<\/span><span class=\"hljs-params\">(ByteBuffer buffer)<\/span> <\/span>{\n  System.out.printf(<span class=\"hljs-string\">\"position = %4d, limit = %4d, capacity = %4d%n\"<\/span>,\n      buffer.position(), buffer.limit(), buffer.capacity());\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Nach dem Anlegen des ByteBuffers sehen wir folgende Ausgabe:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">position = 0, limit = 1000,  capacity = 1000 <\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Klartext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Hier eine grafische Darstellung, damit du dir den Buffer besser vorstellen kannst. Der gelbe Bereich ist leer und kann im folgenden gef\u00fcllt werden.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"118\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_0_allocate-800x118.png\" alt=\"ByteBuffer mit position = 0, limit = 1000,  capacity = 1000\" class=\"wp-image-10013\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_0_allocate-800x118.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_0_allocate-224x33.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_0_allocate-336x49.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_0_allocate-504x74.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_0_allocate-672x99.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_0_allocate-400x59.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_0_allocate-600x88.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_0_allocate.png 856w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"bytebuffer-position-limit-und-capacity\"> ByteBuffer-Position, -Limit und -Capacity<\/h2>\n\n\n\n<p>Die ausgegebenen Werte bedeuten im Einzelnen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>position<\/code> ist die Schreib-\/Leseposition. Diese ist bei einem neuen Buffer immer 0.<\/li>\n\n\n\n<li><code>limit<\/code> hat zwei Bedeutungen: Wenn wir in den Buffer schreiben, kennzeichnet <code>limit<\/code> die Position, bis zu der wir schreiben k\u00f6nnen. Wenn wir aus dem Buffer lesen, zeigt <code>limit<\/code>, bis zu welcher Position der Buffer Daten enth\u00e4lt. Initial ist ein <code>ByteBuffer<\/code> immer im Schreibmodus und <code>limit<\/code> gleicht <code>capacity<\/code> \u2013 den leeren Buffer k\u00f6nnen wir bis zum Ende beschreiben.<\/li>\n\n\n\n<li><code>capacity<\/code> bezeichnet die Gr\u00f6\u00dfe des Buffers. Diese entspricht den 1.000 Bytes, die wir bei der <code>allocate()<\/code>-Methode angegebenen haben. Sie wird sich w\u00e4hrend der Lebenszeit des Buffers nicht mehr \u00e4ndern.<\/li>\n<\/ul>\n\n\n<div class=\"convertkit-form wp-block-convertkit-form\" style=\"\"><script async data-uid=\"1427197203\" src=\"https:\/\/happycoders.kit.com\/1427197203\/index.js\" data-jetpack-boost=\"ignore\" data-no-defer=\"1\" data-no-optimize=\"1\" nowprocket><\/script><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"der-bytebuffer-schreib-lese-zyklus\">Der ByteBuffer-Schreib-Lese-Zyklus<\/h2>\n\n\n\n<p>Ein vollst\u00e4ndiger Schreib-Lese-Zyklus besteht aus den Schritten <code>put()<\/code>, <code>flip()<\/code>, <code>get()<\/code> und <code>compact()<\/code>. Diese werden wir uns in den folgenden Abschnitten anschauen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"schreiben-in-den-bytebuffer-mit-put\">Schreiben in den ByteBuffer mit put()<\/h3>\n\n\n\n<p>Zum Schreiben in den <code>ByteBuffer<\/code> gibt es diverse <code>put()<\/code>-Methoden, um einzelne Bytes, ein Byte-Array oder auch andere primitive Datentypen (wie char, double, float, int, long, short) in den Buffer zu schreiben. <\/p>\n\n\n\n<p>In unserem Beispiel schreiben wir 100 mal den Wert 1 in den Buffer und schauen uns danach erneut die Buffer-Kennzahlen an:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">int<\/span> i = <span class=\"hljs-number\">0<\/span>; i &lt; <span class=\"hljs-number\">100<\/span>; i++) {\n  buffer.put((<span class=\"hljs-keyword\">byte<\/span>) <span class=\"hljs-number\">1<\/span>);\n}\n\nprintMetrics(buffer);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Wenn wir das Programm laufen lassen, sehen wir folgende Ausgabe:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">position = 100, limit = 1000,  capacity = 1000<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Klartext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Die Position hat sich also um 100 Bytes nach rechts verschoben; der Buffer sieht nun wie folgt aus:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"118\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_1_put-800x118.png\" alt=\"ByteBuffer mit position = 100, limit = 1000,  capacity = 1000\" class=\"wp-image-10014\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_1_put-800x118.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_1_put-224x33.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_1_put-336x49.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_1_put-504x74.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_1_put-672x99.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_1_put-400x59.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_1_put-600x88.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_1_put.png 856w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n<\/div>\n\n\n<p>Als n\u00e4chstes schreiben wir 200 mal eine Zwei in den Buffer. Dieses Mal verwenden wir dazu eine andere Methode: Wir f\u00fcllen zun\u00e4chst ein Byte-Array, kopieren dieses in den Buffer, und geben wieder die Metriken aus:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">byte<\/span>&#091;] twos = <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-keyword\">byte<\/span>&#091;<span class=\"hljs-number\">200<\/span>];\nArrays.fill(twos, (<span class=\"hljs-keyword\">byte<\/span>) <span class=\"hljs-number\">2<\/span>);\nbuffer.put(twos);\n\nprintMetrics(buffer);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Wir sehen nun:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">position = 300, limit = 1000,  capacity = 1000<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Klartext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Die Position hat sich um weitere 200 Bytes nach rechts verschoben; der Buffer sieht wie folgt aus:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"118\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_2_put-800x118.png\" alt=\"ByteBuffer mit position = 300, limit = 1000,  capacity = 1000\" class=\"wp-image-10015\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_2_put-800x118.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_2_put-224x33.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_2_put-336x49.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_2_put-504x74.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_2_put-672x99.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_2_put-400x59.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_2_put-600x88.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_2_put.png 856w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"umschalten-in-den-lesemodus-mit-buffer-flip\">Umschalten in den Lesemodus mit Buffer.flip()<\/h3>\n\n\n\n<p>Zum Lesen aus dem Buffer gibt es entsprechende <code>get()<\/code>-Methoden. Diese werden bspw. beim Schreiben in einen Channel durch <code>Channel.write(buffer)<\/code> aufgerufen.<\/p>\n\n\n\n<p>Da <code>position<\/code> nicht nur die Schreib-, sondern auch die Leseposition anzeigt, m\u00fcssen wir <code>position<\/code> zur\u00fcck auf 0 setzen.<\/p>\n\n\n\n<p>Gleichzeitig setzen wir limit auf 300, um zu signalisieren, dass aus dem Buffer maximal 300 Bytes gelesen werden k\u00f6nnen.<\/p>\n\n\n\n<p>Im Programmcode machen wir das wie folgt:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">buffer.limit(buffer.position());\nbuffer.position(<span class=\"hljs-number\">0<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Da diese zwei Zeilen bei jedem Umschalten vom Schreib- in den Lesemodus ben\u00f6tigt werden, gibt es eine <code>ByteBuffer<\/code>-Methode, die genau dasselbe f\u00fcr uns tut:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">buffer.flip();<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Ein Aufruf von <code>printMetrics()<\/code> zeigt uns nun folgende Werte:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">position = 0, limit = 300,  capacity = 1000<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Klartext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Der Positions-Zeiger ist also an den Anfang des Buffers zur\u00fcckgesprungen, und <code>limit<\/code> zeigt auf das Ende des gef\u00fcllten Bereichs:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"104\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_3_flip-800x104.png\" alt=\"ByteBuffer mit position = 0, limit = 300,  capacity = 1000\" class=\"wp-image-10016\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_3_flip-800x104.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_3_flip-224x29.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_3_flip-336x44.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_3_flip-504x65.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_3_flip-672x87.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_3_flip-400x52.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_3_flip-600x78.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_3_flip.png 856w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n<\/div>\n\n\n<p>Damit ist der Buffer bereit, um gelesen zu werden.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"lesen-aus-dem-bytebuffer-mit-get\">Lesen aus dem ByteBuffer mit get()<\/h3>\n\n\n\n<p>Nehmen wir an, der Channel, in den wir schreiben wollen, kann momentan nur 200 der 300 Bytes aufnehmen. Das k\u00f6nnen wir simulieren wir, in dem wir der <code>ByteBuffer.get()<\/code>-Methode ein 200 Byte gro\u00dfes Byte-Array \u00fcbergeben, in das der Buffer seine Daten schreiben soll:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">buffer.get(<span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-keyword\">byte<\/span>&#091;<span class=\"hljs-number\">200<\/span>]);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><code>printMetrics()<\/code> zeigt uns nun folgendes an:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">position = 200, limit = 300,  capacity = 1000<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Klartext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Die Leseposition ist um 200 Bytes nach rechts ger\u00fcckt \u2013 also ans Ende der gelesenen Daten, bzw. an den Anfang der noch nicht gelesenen Daten:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"125\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_4_get-800x125.png\" alt=\"ByteBuffer mit position = 200, limit = 300,  capacity = 1000\" class=\"wp-image-10017\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_4_get-800x125.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_4_get-224x35.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_4_get-336x53.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_4_get-504x79.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_4_get-672x105.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_4_get-400x63.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_4_get-600x94.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_4_get.png 856w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"umschalten-in-den-schreibmodus-wie-man-es-nicht-macht\">Umschalten in den Schreibmodus \u2013 wie man es <em>nicht<\/em> macht<\/h3>\n\n\n\n<p>Um jetzt wieder in den Buffer zu schreiben, k\u00f6nnte man folgenden Fehler begehen: Man setzt <code>position<\/code> auf das Ende der Daten, also 300, und <code>limit<\/code> wieder auf 1.000. Damit sind wir bei exakt dem Zustand, in dem wir nach dem Schreiben der Einsen und Zweien waren:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"118\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_2_put-800x118.png\" alt=\"ByteBuffer mit position = 300, limit = 1000,  capacity = 1000\" class=\"wp-image-10015\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_2_put-800x118.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_2_put-224x33.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_2_put-336x49.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_2_put-504x74.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_2_put-672x99.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_2_put-400x59.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_2_put-600x88.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_2_put.png 856w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n<\/div>\n\n\n<p>Nehmen wir an, wir w\u00fcrden jetzt 300 weitere Bytes in den Buffer schreiben. Der Buffer s\u00e4he danach wie folgt aus:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"118\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_5_put-800x118.png\" alt=\"ByteBuffer mit position = 600, limit = 1000,  capacity = 1000\" class=\"wp-image-10018\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_5_put-800x118.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_5_put-224x33.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_5_put-336x49.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_5_put-504x74.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_5_put-672x99.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_5_put-400x59.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_5_put-600x88.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_5_put.png 856w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n<\/div>\n\n\n<p>Wenn wir nun mit <code>flip()<\/code> zur\u00fcck in den Lesemodus schalten w\u00fcrden, dann w\u00e4re <code>position<\/code> wieder auf 0:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"104\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_6_flip-800x104.png\" alt=\"ByteBuffer mit position = 0, limit = 600,  capacity = 1000\" class=\"wp-image-10019\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_6_flip-800x104.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_6_flip-224x29.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_6_flip-336x44.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_6_flip-504x65.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_6_flip-672x87.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_6_flip-400x52.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_6_flip-600x78.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_6_flip.png 856w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n<\/div>\n\n\n<p>Jetzt w\u00fcrden wir allerdings die ersten, bereits gelesenen, 200 Bytes noch einmal lesen.<\/p>\n\n\n\n<p>Diese Vorgehensweise ist also falsch. Wie man es richtig macht, erkl\u00e4rt der folgende Abschnitt.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"umschalten-in-den-schreibmodus-mit-buffer-compact\">Umschalten in den Schreibmodus mit Buffer.compact()<\/h3>\n\n\n\n<p>Stattdessen m\u00fcssen wir beim Umschalten in den Schreibmodus wie folgt vorgehen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Wir berechnen die Anzahl der verbleibenden Bytes: <code>remaining = limit - position<\/code>, im Beispiel ergibt das 100.<\/li>\n\n\n\n<li>Wir schieben die verbleibenden Bytes an den Anfang des Buffers.<\/li>\n\n\n\n<li>Wir setzen die Schreibposition ans Ende der nach links verschobenen Bytes, im Beispiel also auf 100.<\/li>\n\n\n\n<li>Wir setzen <code>limit<\/code> auf das Ende des Buffers.<\/li>\n<\/ul>\n\n\n\n<p>Auch hierf\u00fcr stellt <code>ByteBuffer<\/code> eine Methode zur Verf\u00fcgung:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">buffer.compact();<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Nach dem Aufruf von <code>compact()<\/code> zeigt uns <code>printMetrics()<\/code> folgendes an:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">position = 100, limit = 1000,  capacity = 1000<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Klartext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In der Grafik sieht der <code>compact()<\/code>-Vorgang wie folgt aus:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"223\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_7_compact-800x223.png\" alt=\"ByteBuffer mit position = 100, limit = 1000,  capacity = 1000\" class=\"wp-image-10020\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_7_compact-800x223.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_7_compact-224x63.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_7_compact-336x94.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_7_compact-504x141.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_7_compact-672x188.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_7_compact-400x112.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_7_compact-600x168.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_7_compact.png 856w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"der-naechste-zyklus\">Der n\u00e4chste Zyklus<\/h3>\n\n\n\n<p>Jetzt k\u00f6nnen wir die n\u00e4chsten 300 Bytes in den Buffer schreiben:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">byte<\/span>&#091;] threes = <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-keyword\">byte<\/span>&#091;<span class=\"hljs-number\">300<\/span>];\nArrays.fill(threes, (<span class=\"hljs-keyword\">byte<\/span>) <span class=\"hljs-number\">3<\/span>);\nbuffer.put(threes);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><code>printMetrics()<\/code> zeigt uns jetzt folgende Werte an:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">position =  400, limit = 1000, capacity = 1000<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Klartext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Nach dem Schreiben der Dreien ist <code>position<\/code> um 300 Bytes nach rechts ger\u00fcckt:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"118\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_8_put-800x118.png\" alt=\"ByteBuffer mit position =  400, limit = 1000, capacity = 1000\" class=\"wp-image-10021\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_8_put-800x118.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_8_put-224x33.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_8_put-336x49.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_8_put-504x74.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_8_put-672x99.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_8_put-400x59.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_8_put-600x88.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_8_put.png 856w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n<\/div>\n\n\n<p>Jetzt k\u00f6nnen wir problemlos mit <code>flip()<\/code> wieder in den Lesemodus umschalten:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-18\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">buffer.flip();<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Ein letzter Aufruf von <code>printMetrics()<\/code> gibt folgende Werte aus:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-19\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">position =    0, limit =  400, capacity = 1000<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-19\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Klartext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Die Leseposition steht am Anfang des Buffers, dort wo die verschobenen 100 Zweien liegen. Wir k\u00f6nnen nun also an genau der Position weiterlesen, an der wir vorhin aufgeh\u00f6rt haben.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"104\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_9_flip-800x104.png\" alt=\"ByteBuffer mit position =  0, limit = 400, capacity = 1000\" class=\"wp-image-10022\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_9_flip-800x104.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_9_flip-224x29.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_9_flip-336x44.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_9_flip-504x65.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_9_flip-672x87.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_9_flip-400x52.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_9_flip-600x78.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/Java_ByteBuffer_9_flip.png 856w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n<\/div>\n\n\n<p>Wenn wir es richtig machen, lesen wir also keine Daten doppelt :)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"zusammenfassung\">Zusammenfassung<\/h2>\n\n\n\n<p>Dieser Artikel hat die Funktionsweise des Java <code>ByteBuffer<\/code>s und dessen Methoden <code>flip()<\/code> und <code>compact()<\/code> anhand eines Beispiels erkl\u00e4rt.<\/p>\n\n\n\n<p>Wenn dir der Artikel geholfen hat den <code>ByteBuffer<\/code> besser zu verstehen, dann teile ihn gerne \u00fcber einen der Share-Buttons unten, und hinterlasse mir einen Kommentar.<\/p>\n<aside><p>Wenn dir der Artikel weitergeholfen hat, w\u00fcrde ich mich sehr \u00fcber eine positive Bewertung auf meinem <a href=\"https:\/\/www.provenexpert.com\/de-de\/sven-woltmann-happycoders-eu\/7smk\/\" target=\"_blank\" rel=\"noopener\">ProvenExpert-Profil<\/a> freuen. Dein Feedback hilft mir, meine Inhalte weiter zu verbessern und motiviert mich, neue informative Artikel zu schreiben.<\/p>\r\n                        <p>\ud83d\udc49 <a href=\"https:\/\/www.provenexpert.com\/de-de\/sven-woltmann-happycoders-eu\/7smk\/\" target=\"_blank\" rel=\"noopener\">Bewertung abgeben<\/a><\/p>\r\n                        <p>Du m\u00f6chtest \u00fcber alle neue Java-Features auf dem Laufenden sein? Dann <a href=\"#\" data-formkit-toggle=\"d8ee997126\">klicke hier<\/a>, um dich f\u00fcr den HappyCoders-Newsletter anzumelden.<\/p>\r\n                        <p>\ud83d\udc49 <a href=\"#\" data-formkit-toggle=\"d8ee997126\">Newsletter-Anmeldung<\/a><\/p><\/aside>","protected":false},"excerpt":{"rendered":"<p>In diesem Artikel zeige ich dir (anhand eines Beispiels), wie der Java ByteBuffer funktioniert und was genau die Methoden flip() und compact() bewirken.<\/p>\n","protected":false},"author":1,"featured_media":34483,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_seopress_titles_title":"","_seopress_titles_desc":"Wie funktioniert der Java ByteBuffer? Wof\u00fcr stehen 'position', 'limit' und 'capacity'? Wie genau funktionieren flip() und compact()? Mit Beispiel.","_seopress_robots_index":"","_seopress_robots_follow":"","_seopress_robots_imageindex":"","_seopress_robots_snippet":"","_seopress_robots_primary_cat":"none","_seopress_robots_breadcrumbs":"","_seopress_robots_freeze_modified_date":"","_seopress_robots_custom_modified_date":"","_seopress_robots_canonical":"","_seopress_social_fb_title":"","_seopress_social_fb_desc":"","_seopress_social_fb_img":"","_seopress_social_fb_img_attachment_id":0,"_seopress_social_fb_img_width":0,"_seopress_social_fb_img_height":0,"_seopress_social_twitter_title":"","_seopress_social_twitter_desc":"","_seopress_social_twitter_img":"","_seopress_social_twitter_img_attachment_id":0,"_seopress_social_twitter_img_width":0,"_seopress_social_twitter_img_height":0,"_seopress_redirections_value":"","_seopress_redirections_enabled":"","_seopress_redirections_enabled_regex":"","_seopress_redirections_logged_status":"both","_seopress_redirections_param":"","_seopress_redirections_type":301,"_seopress_analysis_target_kw":"ByteBuffer,flip,compact","_seopress_news_disabled":"","_seopress_video_disabled":"","_seopress_video":[{"url":"","title":"","desc":"","thumbnail":"","duration":"","rating":"","view_count":"","tag":"","cat":""}],"_seopress_pro_schemas_manual":[{"_seopress_pro_rich_snippets_type":"none"}],"_seopress_pro_rich_snippets_disable_all":"","_seopress_pro_rich_snippets_disable":[],"_seopress_pro_schemas":[],"_uag_custom_page_level_css":"","_wp_convertkit_post_meta":{"form":"-1","landing_page":"","tag":"0","restrict_content":"0"},"_metis_text_type":"standard","_metis_text_length":9932,"_post_count":0,"footnotes":""},"categories":[64],"tags":[165],"class_list":["post-9884","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-java","tag-java-fortgeschritten"],"uagb_featured_image_src":{"full":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/java-byte-buffer-flip-compact.jpg",1770,986,false],"thumbnail":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/java-byte-buffer-flip-compact.jpg",150,84,false],"medium":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/java-byte-buffer-flip-compact.jpg",300,167,false],"medium_large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/java-byte-buffer-flip-compact.jpg",768,428,false],"large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/java-byte-buffer-flip-compact.jpg",1024,570,false],"feature_thumb_224":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/java-byte-buffer-flip-compact-224x125.jpg",224,125,true],"feature_thumb_336":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/java-byte-buffer-flip-compact-336x187.jpg",336,187,true],"feature_thumb_504":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/java-byte-buffer-flip-compact-504x281.jpg",504,281,true],"feature_thumb_672":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/java-byte-buffer-flip-compact-672x374.jpg",672,374,true],"half_400":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/java-byte-buffer-flip-compact-400x223.jpg",400,223,true],"half_600":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/java-byte-buffer-flip-compact-600x334.jpg",600,334,true],"full_800":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/java-byte-buffer-flip-compact-800x446.jpg",800,446,true],"full_944":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/java-byte-buffer-flip-compact-944x526.jpg",944,526,true],"full_1200":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/java-byte-buffer-flip-compact-1200x668.jpg",1200,668,true],"wide_1180":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/java-byte-buffer-flip-compact-1180x490.jpg",1180,490,true],"wide_1770":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/java-byte-buffer-flip-compact-1770x735.jpg",1770,735,true],"1536x1536":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/java-byte-buffer-flip-compact.jpg",1536,856,false],"2048x2048":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/java-byte-buffer-flip-compact.jpg",1770,986,false]},"uagb_author_info":{"display_name":"Sven Woltmann","author_link":"https:\/\/www.happycoders.eu\/de\/author\/sven\/"},"uagb_comment_info":0,"uagb_excerpt":"In diesem Artikel zeige ich dir (anhand eines Beispiels), wie der Java ByteBuffer funktioniert und was genau die Methoden flip() und compact() bewirken.","public_identification_id":"403d11b0a1774ab8bc11d8e8830b3ca8","private_identification_id":"e9065db28d364d52a1793c8ecd28459e","_links":{"self":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/9884","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/comments?post=9884"}],"version-history":[{"count":10,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/9884\/revisions"}],"predecessor-version":[{"id":52426,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/9884\/revisions\/52426"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media\/34483"}],"wp:attachment":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media?parent=9884"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/categories?post=9884"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/tags?post=9884"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}