{"id":9586,"date":"2020-02-12T15:30:53","date_gmt":"2020-02-12T14:30:53","guid":{"rendered":"https:\/\/www.happycoders.eu\/?p=9586"},"modified":"2024-11-29T15:47:59","modified_gmt":"2024-11-29T14:47:59","slug":"strukturierte-daten-schreiben-lesen-dataoutputstream-datainputstream","status":"publish","type":"post","link":"https:\/\/www.happycoders.eu\/de\/java\/strukturierte-daten-schreiben-lesen-dataoutputstream-datainputstream\/","title":{"rendered":"DataOutputStream + DataInputStream (Java Datei Tutorial)"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">In den ersten vier Teilen dieser Artikelserie haben wir das <a href=\"\/de\/java\/dateien-einfach-schnell-lesen\/\">Lesen<\/a> und <a href=\"\/de\/java\/dateien-schnell-einfach-schreiben\/\">Schreiben von Dateien<\/a> behandelt, die <a href=\"\/de\/java\/dateinamen-verzeichnisnamen-file-path-paths\/\">Konstruktion von Verzeichnis- und Dateipfaden<\/a>, sowie <a href=\"\/de\/java\/verzeichnisse-listen-dateien-verschieben-kopieren-loeschen\/\">Verzeichnis- und Dateioperationen<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Gelesen und geschrieben haben wir bisher ausschlie\u00dflich Byte-Arrays und Strings. In diesem f\u00fcnften Teil erf\u00e4hrst du, wie du mit <code>DataOutputStream<\/code>, <code>DataInputStream<\/code>, <code>ObjectOutputStream<\/code> und <code>ObjectInputStream<\/code> strukturierte Daten schreiben und lesen kannst. Im einzelnen werden folgende Fragen beantwortet:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Wie speichert man primitive Datentypen (int, long, char, etc...) in Bin\u00e4rdateien und wie liest man sie wieder?<\/li>\n\n\n\n<li>Welche verschiedenen Arten gibt es Strings in Bin\u00e4rdateien zu schreiben und sie daraus zu lesen?<\/li>\n\n\n\n<li>Wie speichert man komplexe Java-Objekte in Bin\u00e4rdateien und wie liest man sie wieder?<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Die Code-Beispiele aus diesem Artikel findest du in meinem <a rel=\"noopener\" href=\"https:\/\/github.com\/SvenWoltmann\/files-structured-data\" target=\"_blank\">GitHub-Repository<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"strukturierte-daten-in-binaerdateien-schreiben-und-aus-diesen-lesen\">Strukturierte Daten in Bin\u00e4rdateien schreiben und aus diesen lesen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Mit <code>DataOutputStream<\/code> und <code>DataInputStream<\/code> ist es m\u00f6glich primitive Datentypen (byte, short, int, long, float, double, boolean, char) sowie Strings in eine Bin\u00e4rdatei zu schreiben und diese wieder auszulesen. <code>DataOutputStream<\/code> und <code>DataInputStream<\/code> werden dabei unter Anwendung des <a rel=\"noopener\" href=\"https:\/\/de.wikipedia.org\/wiki\/Decorator\" target=\"_blank\">Decorator-Patterns<\/a> um einen <code>OutputStream<\/code> (z. B. <code>FileOutputStream<\/code>) bzw. um einen <code>InputStream<\/code> (z. B. <code>FileInputStream<\/code>) gewrappt.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"strukturierte-daten-schreiben-mit-dataoutputstream\">Strukturierte Daten schreiben mit DataOutputStream<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Das folgende Beispiel schreibt Variablen aller primitiven Datentypen in die Datei <code>test1.bin<\/code>:<\/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\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">TestDataOutputStream1<\/span> <\/span>{\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(String&#091;] args)<\/span> <span class=\"hljs-keyword\">throws<\/span> IOException <\/span>{\n    <span class=\"hljs-keyword\">try<\/span> (<span class=\"hljs-keyword\">var<\/span> out = <span class=\"hljs-keyword\">new<\/span> DataOutputStream(<span class=\"hljs-keyword\">new<\/span> BufferedOutputStream(\n          <span class=\"hljs-keyword\">new<\/span> FileOutputStream(<span class=\"hljs-string\">\"test1.bin\"<\/span>)))) {\n      out.writeByte((<span class=\"hljs-keyword\">byte<\/span>) <span class=\"hljs-number\">123<\/span>);\n      out.writeShort((<span class=\"hljs-keyword\">short<\/span>) <span class=\"hljs-number\">1_234<\/span>);\n      out.writeInt(<span class=\"hljs-number\">1_234_567<\/span>);\n      out.writeLong(<span class=\"hljs-number\">1_234_567_890_123_456L<\/span>);\n      out.writeFloat((<span class=\"hljs-keyword\">float<\/span>) Math.E);\n      out.writeDouble(Math.PI);\n      out.writeBoolean(<span class=\"hljs-keyword\">true<\/span>);\n      out.writeChar(<span class=\"hljs-string\">'\u20ac'<\/span>);\n    }\n  }\n}<\/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 class=\"wp-block-paragraph\">Die Datei <code>test1.bin<\/code> enth\u00e4lt nun folgende Bytes:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">7b 04 d2 00 12 d6 87 00 04 62 d5 3c 8a ba c0 40 2d f8 54 40 09 21 fb 54 44 2d 18 01 20 ac<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><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 class=\"wp-block-paragraph\">Die Werte wurden also im <a href=\"https:\/\/de.wikipedia.org\/wiki\/Byte-Reihenfolge#Big-endian\" target=\"_blank\" rel=\"noopener\">Big-Endian<\/a>-Format sequentiell in die Datei geschrieben:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>7b<\/code> = 123<\/li>\n\n\n\n<li><code>04 d2<\/code> = 1.234<\/li>\n\n\n\n<li><code>00 12 d6 87<\/code> = 1.234.567<\/li>\n\n\n\n<li><code>00 04 62 d5 3c 8a ba c0<\/code> = 1.234.567.890.123.456<\/li>\n\n\n\n<li><code>40 2d f8 54<\/code> = 2,7182817<\/li>\n\n\n\n<li><code>40 09 21 fb 54 44 2d 18<\/code> = 3,141592653589793<\/li>\n\n\n\n<li><code>01<\/code> = true<\/li>\n\n\n\n<li><code>20 ac<\/code> = '\u20ac' (<a rel=\"noopener\" href=\"https:\/\/www.compart.com\/de\/unicode\/U+20AC\" target=\"_blank\">Unicode U-20AC<\/a>)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"strukturierte-daten-lesen-mit-datainputstream\">Strukturierte Daten lesen mit DataInputStream <\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Genauso einfach wie wir die Daten geschrieben haben, k\u00f6nnen wir sie auch wieder lesen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">TestDataInputStream1<\/span> <\/span>{\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(String&#091;] args)<\/span> <span class=\"hljs-keyword\">throws<\/span> IOException <\/span>{\n    <span class=\"hljs-keyword\">try<\/span> (<span class=\"hljs-keyword\">var<\/span> in = <span class=\"hljs-keyword\">new<\/span> DataInputStream(<span class=\"hljs-keyword\">new<\/span> BufferedInputStream(\n          <span class=\"hljs-keyword\">new<\/span> FileInputStream(<span class=\"hljs-string\">\"test1.bin\"<\/span>)))) {\n      System.out.println(in.readByte());\n      System.out.println(in.readShort());\n      System.out.println(in.readInt());\n      System.out.println(in.readLong());\n      System.out.println(in.readFloat());\n      System.out.println(in.readDouble());\n      System.out.println(in.readBoolean());\n      System.out.println(in.readChar());\n    }\n  }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><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 class=\"wp-block-paragraph\">Das Programm gibt folgendes aus:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">123\n1234\n1234567\n1234567890123456\n2.7182817\n3.141592653589793\ntrue\n\u20ac<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><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 class=\"wp-block-paragraph\">Das sind exakt die Daten, die wir geschrieben haben.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"abweichende-datentypen-bei-writebyte-und-writeshort\">Abweichende Datentypen bei writeByte() und writeShort()<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn du dir die write-Methoden von <code>DateOutputStream<\/code> n\u00e4her anschaust, f\u00e4llt auf, dass <code>writeByte()<\/code>, <code>writeShort()<\/code> und auch <code>writeChar()<\/code> jeweils ein <code>int<\/code> als Parameter erwarten und nicht den jeweiligen Datentyp. Den Grund daf\u00fcr konnte ich nicht herausfinden; auch der Quellcode der Methoden enth\u00e4lt keine Erkl\u00e4rung. Das ist nat\u00fcrlich fehleranf\u00e4llig und man sollte wissen, was die Konsequenzen sind, wenn die \u00fcbergebenen Werte nicht in den genannten Datentyp passen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Was passiert in dem Fall? Testen wir es f\u00fcr <code>writeByte()<\/code> mit folgendem Code. Ich habe hier die resultierenden Bytes direkt als Kommentare in den Code eingef\u00fcgt, um die Zuordnung zu erleichtern.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">TestDataOutputStream2<\/span> <\/span>{\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(String&#091;] args)<\/span> <span class=\"hljs-keyword\">throws<\/span> IOException <\/span>{\n    <span class=\"hljs-keyword\">try<\/span> (<span class=\"hljs-keyword\">var<\/span> out = <span class=\"hljs-keyword\">new<\/span> DataOutputStream(<span class=\"hljs-keyword\">new<\/span> BufferedOutputStream(\n          <span class=\"hljs-keyword\">new<\/span> FileOutputStream(<span class=\"hljs-string\">\"test2.bin\"<\/span>)))) {\n      out.writeByte(<span class=\"hljs-number\">1000<\/span>);  <span class=\"hljs-comment\">\/\/ --&gt; e8<\/span>\n      out.writeByte(<span class=\"hljs-number\">128<\/span>);   <span class=\"hljs-comment\">\/\/ --&gt; 80<\/span>\n      out.writeByte(<span class=\"hljs-number\">127<\/span>);   <span class=\"hljs-comment\">\/\/ --&gt; 7f (Byte.MAX_VALUE)<\/span>\n      out.writeByte(<span class=\"hljs-number\">0<\/span>);     <span class=\"hljs-comment\">\/\/ --&gt; 00<\/span>\n      out.writeByte(-<span class=\"hljs-number\">128<\/span>);  <span class=\"hljs-comment\">\/\/ --&gt; 80 (Byte.MIN_VALUE)<\/span>\n      out.writeByte(-<span class=\"hljs-number\">129<\/span>);  <span class=\"hljs-comment\">\/\/ --&gt; 7f<\/span>\n      out.writeByte(-<span class=\"hljs-number\">1000<\/span>); <span class=\"hljs-comment\">\/\/ --&gt; 18<\/span>\n    }\n  }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><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 class=\"wp-block-paragraph\">Overflows werden also nicht durch eine Fehlermeldung quittiert. Was wir stattdessen sehen, ist das letzte Byte der jeweiligen int-Darstellung der Zahl, was wir mit folgendem Code zeigen k\u00f6nnen (ich verwende hier eine Standard-Textbox, um Markierungen zu erm\u00f6glichen):<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>public class <\/strong>TestDataOutputStream3 {\n  <strong>public static void <\/strong>main(String[] args) <strong>throws <\/strong>IOException {\n    <strong>try <\/strong>(<strong>var <\/strong>out = <strong>new <\/strong>DataOutputStream(<strong>new <\/strong>BufferedOutputStream(\n          <strong>new <\/strong>FileOutputStream(<strong>\"test2.bin\"<\/strong>)))) {\n      out.writeInt(1000);  <em>\/\/ --&gt; 00 00 03 <span style=\"background:yellow\">e8<\/span>\n      <\/em>out.writeInt(128);   <em>\/\/ --&gt; 00 00 00 <span style=\"background:yellow\">80<\/span>\n      <\/em>out.writeInt(127);   <em>\/\/ --&gt; 00 00 00 <span style=\"background:yellow\">7f<\/span>\n      <\/em>out.writeInt(0);     <em>\/\/ --&gt; 00 00 00 <span style=\"background:yellow\">00<\/span>\n      <\/em>out.writeInt(-128);  <em>\/\/ --&gt; ff ff ff <span style=\"background:yellow\">80<\/span>\n      <\/em>out.writeInt(-129);  <em>\/\/ --&gt; ff ff ff <span style=\"background:yellow\">7f<\/span>\n      <\/em>out.writeInt(-1000); <em>\/\/ --&gt; ff ff fc <span style=\"background:yellow\">18<\/span>\n    <\/em>}\n  }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00fcr <code>writeShort()<\/code> gilt das analog. Hier habe ich die int-Repr\u00e4sentation direkt mit in den Kommentar aufgenommen.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>public class <\/strong>TestDataOutputStream4 {\n  <strong>public static void <\/strong>main(String[] args) <strong>throws <\/strong>IOException {\n    <strong>try <\/strong>(<strong>var <\/strong>out = <strong>new <\/strong>DataOutputStream(<strong>new <\/strong>BufferedOutputStream(\n          <strong>new <\/strong>FileOutputStream(<strong>\"test2.bin\"<\/strong>)))) {\n      out.writeShort(1000000);  <em>\/\/ --&gt; 42 40 (int: 00 0f <span style=\"background:yellow\">42 40<\/span>)\n      <\/em>out.writeShort(32768);    <em>\/\/ --&gt; 80 00 (int: 00 00 <span style=\"background:yellow\">80 00<\/span>)\n      <\/em>out.writeShort(32767);    <em>\/\/ --&gt; 7f ff (int: 00 00 <span style=\"background:yellow\">7f ff<\/span>)\n      <\/em>out.writeShort(0);        <em>\/\/ --&gt; 00 00 (int: 00 00 <span style=\"background:yellow\">00 00<\/span>)\n      <\/em>out.writeShort(-32768);   <em>\/\/ --&gt; 80 00 (int: ff ff <span style=\"background:yellow\">80 00<\/span>)\n      <\/em>out.writeShort(-32769);   <em>\/\/ --&gt; 7f ff (int: ff ff <span style=\"background:yellow\">7f ff<\/span>)\n      <\/em>out.writeShort(-1000000); <em>\/\/ --&gt; bd c0 (int: ff f0 <span style=\"background:yellow\">bd c0<\/span>)\n    <\/em>}\n  }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"abweichender-datentyp-bei-writechar\">Abweichender Datentyp bei writeChar()<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ein <code>char<\/code> wird in Java durch zwei Bytes repr\u00e4sentiert und kann \u2013 ohne Type Casting \u2013 einem <code>int<\/code> zugewiesen werden. Folgendes ist also vollkommen in Ordnung:<\/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\">int<\/span> a    = <span class=\"hljs-string\">'a'<\/span>; <span class=\"hljs-comment\">\/\/ Unicode U+0066<\/span>\n<span class=\"hljs-keyword\">int<\/span> euro = <span class=\"hljs-string\">'\u20ac'<\/span>; <span class=\"hljs-comment\">\/\/ Unicode U+20AC<\/span>\n<span class=\"hljs-keyword\">int<\/span> word = <span class=\"hljs-string\">'\u5b57'<\/span>; <span class=\"hljs-comment\">\/\/ Unicode U+5B57<\/span><\/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 class=\"wp-block-paragraph\">Von daher ist es syntaktisch korrekt, dass <code>writeChar()<\/code> ein <code>int<\/code> entgegennimmt. Doch was passiert hier, wenn wir Werte \u00fcbergeben, die gr\u00f6\u00dfer als zwei Byte oder negativ sind? Probieren wir es aus. In den Kommentaren in folgendem Code-Beispiel siehst Du die resultierenden Bytes und \u2013 bei den gro\u00dfen und negativen Zahlen \u2013 auch die jeweilige <code>int<\/code>-Darstellung. Auch hier sehen wir wieder, dass jeweils die letzten zwei Bytes der <code>int<\/code>-Darstellung \u00fcbernommen werden.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>public class <\/strong>TestDataOutputStream5 {\n  <strong>public static void <\/strong>main(String[] args) <strong>throws <\/strong>IOException {\n    <strong>try <\/strong>(<strong>var <\/strong>out = <strong>new <\/strong>DataOutputStream(<strong>new <\/strong>BufferedOutputStream(\n          <strong>new <\/strong>FileOutputStream(<strong>\"test5.bin\"<\/strong>)))) {\n      out.writeChar(<strong>'a'<\/strong>);  <em>\/\/ --&gt; 00 61\n      <\/em>out.writeChar(<strong>'\u20ac'<\/strong>);  <em>\/\/ --&gt; 20 ac\n      <\/em>out.writeChar(<strong>'\u5b57'<\/strong>); <em>\/\/ --&gt; 5b 57\n\n      <\/em>out.writeChar(723_790_628); <em>\/\/ --&gt; 2b 24 (int: 2b 24 <span style=\"background:yellow\">2b 24<\/span>)\n      <\/em>out.writeChar(-100);        <em>\/\/ --&gt; ff 9c (int: ff ff <span style=\"background:yellow\">ff 9c<\/span>)\n      <\/em>out.writeChar(-16_776_261); <em>\/\/ --&gt; 03 bb (int: ff 00 <span style=\"background:yellow\">03 bb<\/span>)\n    <\/em>}\n  }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Was bekommen wir, wenn wir die erstellte Datei mit <code>readChar()<\/code> wieder einlesen? Hier zun\u00e4chst der Quellcode daf\u00fcr:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">TestDataInputStream5<\/span> <\/span>{\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(String&#091;] args)<\/span> <span class=\"hljs-keyword\">throws<\/span> IOException <\/span>{\n    <span class=\"hljs-keyword\">try<\/span> (<span class=\"hljs-keyword\">var<\/span> in = <span class=\"hljs-keyword\">new<\/span> DataInputStream(<span class=\"hljs-keyword\">new<\/span> BufferedInputStream(\n          <span class=\"hljs-keyword\">new<\/span> FileInputStream(<span class=\"hljs-string\">\"test5.bin\"<\/span>)))) {\n      System.out.println(in.readChar());\n      System.out.println(in.readChar());\n      System.out.println(in.readChar());\n      System.out.println(in.readChar());\n      System.out.println(in.readChar());\n      System.out.println(in.readChar());\n    }\n  }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><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 class=\"wp-block-paragraph\">Und hier die Ausgabe:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">a\n\u20ac\n\u5b57\n\u2b24\n\uff9c\n\u03bb<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><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 class=\"wp-block-paragraph\">Aus der 723.790.628 ist nun beispielsweise \u00fcber die hexadezimale Darstellung 0x2b242b24 \u2013 davon die letzten zwei Bytes 0x2b24 \u2013 das <a rel=\"noopener\" href=\"https:\/\/www.compart.com\/de\/unicode\/U+2B24\" target=\"_blank\">Unicode-Zeichen U+2B24 (Schwarzer gro\u00dfer Kreis)<\/a> geworden. -100 wurde \u00fcber 0xffffff9c zu <a rel=\"noopener\" href=\"https:\/\/www.compart.com\/de\/unicode\/U+FF9C\" target=\"_blank\">U+FF9C (Halbbreiter Katakana-Buchstabe Wa)<\/a> und -16.776.261 wurde \u00fcber 0xff0003bb zu <a rel=\"noopener\" href=\"https:\/\/www.compart.com\/de\/unicode\/U+03BB\" target=\"_blank\">U+03BB (Griechischer Kleinbuchstabe Lamda)<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"strings-schreiben-mit-dataoutputstream\">Strings schreiben mit DataOutputStream<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>DataOutputStream<\/code> verwirrt mit drei unterschiedlichen Methoden, um Strings zu schreiben:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>writeBytes(String s)<\/code><\/li>\n\n\n\n<li><code>writeChars(String s)<\/code><\/li>\n\n\n\n<li><code>writeUTF(String s)<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><code>DataInputStream<\/code> hingegen bietet neben einer als <em>deprecated<\/em> markierten <code>readLine()<\/code>-Methode, die wir hier nicht weiter betrachten wollen, nur die <code>readUTF()<\/code>-Methode, um einen String zu lesen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wie unterscheiden sich die drei <code>write<\/code>-Methoden? Testen wir es mit einem String, der die unterschiedlichsten Arten von Zeichen enth\u00e4lt, die Unicode zu bieten hat:<\/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\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">TestDataOutputStream6<\/span> <\/span>{\n  <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">final<\/span> String STRING = <span class=\"hljs-string\">\"Hello World \u00e4\u00f6\u00fc \u00df \u03b1 \u20ac \u2196 ?\"<\/span>;\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(String&#091;] args)<\/span> <span class=\"hljs-keyword\">throws<\/span> IOException <\/span>{\n    <span class=\"hljs-keyword\">try<\/span> (<span class=\"hljs-keyword\">var<\/span> out = <span class=\"hljs-keyword\">new<\/span> DataOutputStream(<span class=\"hljs-keyword\">new<\/span> BufferedOutputStream(\n          <span class=\"hljs-keyword\">new<\/span> FileOutputStream(<span class=\"hljs-string\">\"test6.bin\"<\/span>)))) {\n      out.writeBytes(STRING);\n      out.writeChars(STRING);\n      out.writeUTF(STRING);\n    }\n  }\n}<\/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 class=\"wp-block-paragraph\">Der Atom-Editor zeigt den Inhalt der erstellten Datei \u2013 je nach eingestelltem Zeichensatz \u2013 wie folgt an:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"50\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/DataOutputStream_write_String_ISO-8859-1-800x50.png\" alt=\" Anzeige des Dateiinhalts mit Zeichencodierung ISO-8859-1\" class=\"wp-image-9684\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/DataOutputStream_write_String_ISO-8859-1-800x50.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/DataOutputStream_write_String_ISO-8859-1-224x14.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/DataOutputStream_write_String_ISO-8859-1-336x21.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/DataOutputStream_write_String_ISO-8859-1-504x32.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/DataOutputStream_write_String_ISO-8859-1-672x42.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/DataOutputStream_write_String_ISO-8859-1-400x25.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/DataOutputStream_write_String_ISO-8859-1-600x38.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/DataOutputStream_write_String_ISO-8859-1.png 940w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption class=\"wp-element-caption\">Anzeige des Dateiinhalts mit Zeichencodierung ISO-8859-1<\/figcaption><\/figure>\n<\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"50\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/DataOutputStream_write_String_UTF-16BE-800x50.png\" alt=\"Anzeige des Dateiinhalts mit Zeichencodierung UTF-16 Big-Endian\" class=\"wp-image-9704\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/DataOutputStream_write_String_UTF-16BE-800x50.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/DataOutputStream_write_String_UTF-16BE-224x14.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/DataOutputStream_write_String_UTF-16BE-336x21.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/DataOutputStream_write_String_UTF-16BE-504x32.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/DataOutputStream_write_String_UTF-16BE-672x42.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/DataOutputStream_write_String_UTF-16BE-400x25.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/DataOutputStream_write_String_UTF-16BE-600x38.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/DataOutputStream_write_String_UTF-16BE.png 940w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption class=\"wp-element-caption\">Anzeige des Dateiinhalts mit Zeichencodierung UTF-16 Big-Endian<\/figcaption><\/figure>\n<\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"50\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/DataOutputStream_write_String_UTF-8-800x50.png\" alt=\"Anzeige des Dateiinhalts mit Zeichencodierung UTF-8\" class=\"wp-image-9686\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/DataOutputStream_write_String_UTF-8-800x50.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/DataOutputStream_write_String_UTF-8-224x14.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/DataOutputStream_write_String_UTF-8-336x21.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/DataOutputStream_write_String_UTF-8-504x32.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/DataOutputStream_write_String_UTF-8-672x42.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/DataOutputStream_write_String_UTF-8-400x25.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/DataOutputStream_write_String_UTF-8-600x38.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/DataOutputStream_write_String_UTF-8.png 940w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption class=\"wp-element-caption\">Anzeige des Dateiinhalts mit Zeichencodierung UTF-8<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Wie die Ausgaben vermuten lassen, unterscheiden sich die Methoden durch die Zeichenkodierung, die zur Ausgabe in die Datei verwendet wird:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>writeBytes()<\/code> schreibt den String im ISO-8859-1-Format, auch bekannt als Latin-1. Hierbei k\u00f6nnen alle Sonderzeichen nach dem \"\u00df\" nicht mehr dargestellt werden.<\/li>\n\n\n\n<li><code>writeChars()<\/code> schreibt den String im UTF-16-Format. Hier werden alle Zeichen korrekt dargestellt.<\/li>\n\n\n\n<li><code>writeUTF()<\/code> schreibt den String in einem <a rel=\"noopener\" href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/io\/DataInput.html#modified-utf-8\" target=\"_blank\">modifizierten UTF-8-Format<\/a>. Dabei werden \"supplementary characters\", d. h. alle Zeichen mit einem Code gr\u00f6\u00dfer als U+FFFF (das Sonderzeichen '?' hat den Code U+1F525) anders als in UTF-8 dargestellt, weshalb Atom hier anstatt des Feuer-Symbol sechs Fragezeichen anzeigt.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Der Inhalt der Datei wird in den folgenden Unterabschnitten erkl\u00e4rt.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Strings schreiben mit DataOutputStream.writeBytes()<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><code>writeBytes()<\/code> hat die folgenden Bytes in die Datei geschrieben (in der ersten Zeile siehst du die hexadezimale Codierung der Bytes, in der zweiten Zeile das jeweils geschriebene Zeichen):<\/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\">48 65 6c 6c 6f 20 57 6f 72 6c 64 20 e4 f6 fc 20 df 20 b1 20 ac 20 96 20 3d 25\nH  e  l  l  o     W  o  r  l  d     \u00e4  \u00f6  \u00fc     \u00df     \u03b1     \u20ac     \u2196     ?<\/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 class=\"wp-block-paragraph\"><code>writeBytes()<\/code> hat f\u00fcr jedes Zeichen ein Byte geschrieben. Jetzt sehen wir auch, was mit den Sonderzeichen passiert ist: Das \u03b1-Zeichen beispielsweise hat den Code U+03B1, davon wurde lediglich das untere Byte 0xB1 in die Datei geschrieben. In ISO-8859-1 steht 0xB1 f\u00fcr das Zeichen '\u00b1', das wir auch im Editor sehen. Das \u20ac-Zeichen hat den Code U+20AC, davon erscheint nur 0xAC in der Datei, was in ISO-8859-1 f\u00fcr '\u00ac' steht. Der Pfeil hat den Code U+2196, dessen unterer Teil 0x96 in ISO-8859-1 nicht belegt ist, weshalb Atom hier eine leere Box anzeigt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Methode <code>writeBytes()<\/code> sollte also nicht verwendet werden. Es sei denn, du bist dir hundertprozentig sicher, dass dein Text ausschlie\u00dflich Zeichen enth\u00e4lt, die durch ISO-8859-1 kodiert werden k\u00f6nnen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Interessant ist noch das Feuer-Symbol: Dieses wird als 0x3D 0x25 in die Datei geschrieben \u2013 zwei Bytes also. Wie kann das sein, wenn <code>writeBytes()<\/code> doch f\u00fcr jedes Zeichen nur ein Byte schreibt?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Antwort lautet: das Feuersymbol ist in Java nicht ein Zeichen, sondern zwei! Folgendes ist nicht erlaubt:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"GLSL\" data-shcb-language-slug=\"glsl\"><span><code class=\"hljs language-glsl\">char c = '?';<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">GLSL<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">glsl<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Dieser Code produziert die Fehlermeldung \"Too many characters in character literal\". Mit folgendem Code untersuchen wir das:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">TestDataOutputStream7<\/span> <\/span>{\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(String&#091;] args)<\/span> <span class=\"hljs-keyword\">throws<\/span> IOException <\/span>{\n    String fire = <span class=\"hljs-string\">\"?\"<\/span>;\n    System.out.println(<span class=\"hljs-string\">\"fire = \"<\/span> + fire);\n    System.out.println(<span class=\"hljs-string\">\"fire.length() = \"<\/span> + fire.length());\n\n    <span class=\"hljs-keyword\">char<\/span> c0 = fire.charAt(<span class=\"hljs-number\">0<\/span>);\n    <span class=\"hljs-keyword\">char<\/span> c1 = fire.charAt(<span class=\"hljs-number\">1<\/span>);\n    System.out.println(<span class=\"hljs-string\">\"fire.charAt(0) = \"<\/span> + c0 +\n          <span class=\"hljs-string\">\" (hex: \"<\/span> + Integer.toHexString(c0) + <span class=\"hljs-string\">\")\"<\/span>);\n    System.out.println(<span class=\"hljs-string\">\"fire.charAt(1) = \"<\/span> + c1 +\n          <span class=\"hljs-string\">\" (hex: \"<\/span> + Integer.toHexString(c1) + <span class=\"hljs-string\">\")\"<\/span>);\n  }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><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 class=\"wp-block-paragraph\">Folgendes bekommen wir ausgegeben:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">fire = ?\nfire.length() = 2\nfire.charAt(0) = ? (hex: d83d)\nfire.charAt(1) = ? (hex: dd25)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><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 class=\"wp-block-paragraph\">Das Feuer-Symbol besteht also aus zwei Characters mit den Codes U+D83D und U+DD25. Bei diesen Codes handelt es sich nicht um eigenst\u00e4ndige Zeichen, sondern um sogenannte Surrogates (\"Stellvertreter\"), die daf\u00fcr verwendet werden, um Unicode-Symbole darzustellen mit einem Code gr\u00f6\u00dfer als U+FFFF, also solche, die mit zwei Bytes nicht repr\u00e4sentiert werden k\u00f6nnen.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Strings schreiben mit DataOutputStream.writeChars()<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Die Methode <code>writeChars()<\/code> hat folgende Bytes in die Datei geschrieben:<\/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\">00 48 00 65 00 6c 00 6c 00 6f 00 20 00 57 00 6f 00 72 00 6c 00 64 00 20\nH     e     l     l     o           W     o     r     l     d\n\n00 e4 00 f6 00 fc 00 20 00 df 00 20 03 b1 00 20 20 ac 00 20 21 96 00 20 d8 3d dd 25\n\u00e4     \u00f6     \u00fc           \u00df           \u03b1           \u20ac           \u2196           ?<\/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 class=\"wp-block-paragraph\">Hier sehen wir f\u00fcr jedes Zeichen zwei Bytes \u2013 die jeweilige UTF-16-Big-Endian-Kodierung. Das Feuer-Symbol wird \u2013 wie im vorangegangenen Abschnitt erl\u00e4utert \u2013 als zwei mal zwei Bytes geschrieben.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Strings schreiben mit DataOutputStream.writeUTF()<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Durch <code>writeUTF()<\/code> wurden folgende Bytes in die Datei geschrieben:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">00 27 48 65 6c 6c 6f 20 57 6f 72 6c 64 20\n      H  e  l  l  o     W  o  r  l  d\n\nc3 a4 c3 b6 c3 bc 20 c3 9f 20 ce b1 20 e2 82 ac 20 e2 86 96 20 ed a0 bd ed b4 a5\n\u00e4     \u00f6     \u00fc        \u00df        \u03b1        \u20ac           \u2196           ? <\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><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 class=\"wp-block-paragraph\">Hier f\u00e4llt zuerst auf, dass dem Text zwei Bytes 0x00 0x27 vorangehen. Hierbei handelt es sich um die L\u00e4nge des Strings als short-Wert. 0x27 ist dezimal 39 \u2013 dies entspricht der Anzahl an Bytes, die auf die ersten zwei Bytes folgen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Beim Feuer-Symbol sehen wir die oben schon erw\u00e4hnte <em>modifizierte<\/em> UTF-8-Kodierung. Laut  <a rel=\"noopener\" href=\"https:\/\/www.compart.com\/de\/unicode\/U+1F525\" target=\"_blank\">https:\/\/www.compart.com\/de\/unicode\/U+1F525<\/a> w\u00e4re die eigentliche UTF-8-Kodierung 0xF0 0x9F 0x94 0xA5. Java kocht an dieser Stelle sein eigenes S\u00fcppchen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"strings-lesen-mit-datainputstream\">Strings lesen mit DataInputStream<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Wie k\u00f6nnen wir nun unsere Strings wieder einlesen? F\u00fcr die mit <code>writeBytes()<\/code> und <code>writeChars()<\/code> geschriebenen Strings gibt es keine entsprechenden <code>read<\/code>-Methoden. Ohnehin m\u00fcssten wir, wenn wir diese Methoden verwenden wollen, zuvor die L\u00e4nge des Strings in die Datei schreiben \u2013 andernfalls w\u00fcssten wir gar nicht, wo dieser endet. Hier der daf\u00fcr entsprechend angepasste Code:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">TestDataOutputStream8<\/span> <\/span>{\n  <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">final<\/span> String STRING = <span class=\"hljs-string\">\"Hello World \u00e4\u00f6\u00fc \u00df \u03b1 \u20ac \u2196 ?\"<\/span>;\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(String&#091;] args)<\/span> <span class=\"hljs-keyword\">throws<\/span> IOException <\/span>{\n    <span class=\"hljs-keyword\">try<\/span> (<span class=\"hljs-keyword\">var<\/span> out = <span class=\"hljs-keyword\">new<\/span> DataOutputStream(<span class=\"hljs-keyword\">new<\/span> BufferedOutputStream(\n          <span class=\"hljs-keyword\">new<\/span> FileOutputStream(<span class=\"hljs-string\">\"test8.bin\"<\/span>)))) {\n      out.writeInt(STRING.length());\n      out.writeBytes(STRING);\n\n      out.writeInt(STRING.length());\n      out.writeChars(STRING);\n\n      out.writeUTF(STRING);\n    }\n  }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><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 class=\"wp-block-paragraph\">Die L\u00e4nge m\u00fcssten wir dann wieder auslesen, danach die passende Anzahl an Bytes lesen und daraus \u2013 und unter Angabe der korrekten Zeichenkodierung \u2013 wieder einen String konstruieren:<\/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\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">TestDataInputStream8<\/span> <\/span>{\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(String&#091;] args)<\/span> <span class=\"hljs-keyword\">throws<\/span> IOException <\/span>{\n    <span class=\"hljs-keyword\">try<\/span> (<span class=\"hljs-keyword\">var<\/span> in = <span class=\"hljs-keyword\">new<\/span> DataInputStream(<span class=\"hljs-keyword\">new<\/span> BufferedInputStream(\n          <span class=\"hljs-keyword\">new<\/span> FileInputStream(<span class=\"hljs-string\">\"test8.bin\"<\/span>)))) {\n      <span class=\"hljs-comment\">\/\/ read String written by writeBytes()<\/span>\n      <span class=\"hljs-keyword\">int<\/span> len = in.readInt();\n      <span class=\"hljs-keyword\">byte<\/span>&#091;] bytes = <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-keyword\">byte<\/span>&#091;len];\n      in.read(bytes, <span class=\"hljs-number\">0<\/span>, len);\n      String s = <span class=\"hljs-keyword\">new<\/span> String(bytes, StandardCharsets.ISO_8859_1);\n      System.out.println(s);\n\n      <span class=\"hljs-comment\">\/\/ read String written by writeChars()<\/span>\n      len = in.readInt();\n      bytes = <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-keyword\">byte<\/span>&#091;len * <span class=\"hljs-number\">2<\/span>];\n      in.read(bytes, <span class=\"hljs-number\">0<\/span>, len * <span class=\"hljs-number\">2<\/span>);\n      s = <span class=\"hljs-keyword\">new<\/span> String(bytes, StandardCharsets.UTF_16BE);\n      System.out.println(s);\n\n      <span class=\"hljs-comment\">\/\/ read String written by writeUTF()<\/span>\n      s = in.readUTF();\n      System.out.println(s);\n    }\n  }\n}<\/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 class=\"wp-block-paragraph\">Hier die Ausgabe:<\/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\">Hello World \u00e4\u00f6\u00fc \u00df \u00b1 \u00ac \u0096 =%\nHello World \u00e4\u00f6\u00fc \u00df \u03b1 \u20ac \u2196 ?\nHello World \u00e4\u00f6\u00fc \u00df \u03b1 \u20ac \u2196 ?<\/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 class=\"wp-block-paragraph\">Das Lesen der mit <code>writeBytes()<\/code> und <code>writeChars()<\/code> geschriebenen Strings ist recht aufw\u00e4ndig. <code>writeBytes()<\/code> kann dar\u00fcber hinaus \u2013 wie zuvor schon festgestellt \u2013 nicht alle Zeichen kodieren, und <code>writeChars()<\/code> belegt f\u00fcr die meisten Texte, mit denen wir hierzulande arbeiten, knapp doppelt so viel Platz wie <code>writeUTF()<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Von daher lautet meine klare Empfehlung f\u00fcr Strings ausschlie\u00dflich <code>writeUTF()<\/code> und <code>readUTF()<\/code> zu verwenden.<\/p>\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=\"java-objekte-in-dateien-schreiben-und-aus-dateien-lesen\">Java-Objekte in Dateien schreiben und aus Dateien lesen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Java bietet uns nicht nur die M\u00f6glichkeit primitive Datentypen und Strings in Dateien zu schreiben. Wir k\u00f6nnen ganze Java-Objekte schreiben und lesen. Java stellt uns daf\u00fcr die Klassen <code>ObjectOutputStream<\/code> und <code>ObjectInputStream<\/code> zur Verf\u00fcgung.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"java-objekte-in-dateien-schreiben-mit-objectoutputstream\">Java-Objekte in Dateien schreiben mit ObjectOutputStream<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Mit <code>ObjectOutputStream.writeObject()<\/code> kannst du beliebige Java-Objekte in eine Datei schreiben. Einzige Vorraussetzung ist, dass das Objekt sowie alle davon \u2013 direkt und transitiv \u2013 referenzierten Objekte serialisierbar sind (d. h. <code>java.io.Serializable<\/code> implementieren). Andernfalls wird eine <code>NotSerializableException<\/code> geworfen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Hier ein Beispiel, in dem wir einen String, eine <code>ArrayList<\/code> und eine durch <code>List.of()<\/code> erstellte Liste in eine Datei schreiben:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-20\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">TestObjectOutputStream1<\/span> <\/span>{\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(String&#091;] args)<\/span> <span class=\"hljs-keyword\">throws<\/span> IOException <\/span>{\n    <span class=\"hljs-keyword\">try<\/span> (<span class=\"hljs-keyword\">var<\/span> out = <span class=\"hljs-keyword\">new<\/span> ObjectOutputStream(<span class=\"hljs-keyword\">new<\/span> BufferedOutputStream(\n          <span class=\"hljs-keyword\">new<\/span> FileOutputStream(<span class=\"hljs-string\">\"objects1.bin\"<\/span>)))) {\n      <span class=\"hljs-comment\">\/\/ Write a string<\/span>\n      out.writeObject(<span class=\"hljs-string\">\"Hello World \u00e4\u00f6\u00fc \u00df \u03b1 \u20ac \u2196 ?\"<\/span>);\n\n      <span class=\"hljs-comment\">\/\/ Write an array list<\/span>\n      ArrayList&lt;Integer&gt; list = <span class=\"hljs-keyword\">new<\/span> ArrayList();\n      list.add(<span class=\"hljs-number\">42<\/span>);\n      list.add(<span class=\"hljs-number\">47<\/span>);\n      list.add(<span class=\"hljs-number\">74<\/span>);\n      out.writeObject(list);\n\n      <span class=\"hljs-comment\">\/\/ Write an unmodifiable list<\/span>\n      out.writeObject(List.of(<span class=\"hljs-string\">\"Hello\"<\/span>, <span class=\"hljs-string\">\"World\"<\/span>));\n    }\n  }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-20\"><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 class=\"wp-block-paragraph\">Die erstellte Datei 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=\"113\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/ObjectOutputStream_example-800x113.png\" alt=\"Mit ObjectOutputStream geschriebene Datei\" class=\"wp-image-9729\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/ObjectOutputStream_example-800x113.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/ObjectOutputStream_example-224x32.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/ObjectOutputStream_example-336x48.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/ObjectOutputStream_example-504x71.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/ObjectOutputStream_example-672x95.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/ObjectOutputStream_example-400x57.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/ObjectOutputStream_example-600x85.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/ObjectOutputStream_example.png 819w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption class=\"wp-element-caption\">Mit ObjectOutputStream geschriebene Datei<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Wir sehen unseren String und k\u00f6nnen ein paar Klassennamen erkennen, doch weiteres erschlie\u00dft sich nicht ohne weiteres. Wir wollen an dieser Stelle auch nicht weiter auf das genaue Bin\u00e4rformat eingehen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"java-objekte-aus-dateien-lesen-mit-objectinputstream\">Java-Objekte aus Dateien lesen mit ObjectInputStream <\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Mit folgendem Code lesen wir die Objekte aus der Datei:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-21\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">TestObjectInputStream1<\/span> <\/span>{\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(String&#091;] args)<\/span> <span class=\"hljs-keyword\">throws<\/span> IOException,\n        ClassNotFoundException <\/span>{\n    <span class=\"hljs-keyword\">try<\/span> (<span class=\"hljs-keyword\">var<\/span> fis = <span class=\"hljs-keyword\">new<\/span> FileInputStream(<span class=\"hljs-string\">\"objects1.bin\"<\/span>);\n         <span class=\"hljs-keyword\">var<\/span> in = <span class=\"hljs-keyword\">new<\/span> ObjectInputStream(<span class=\"hljs-keyword\">new<\/span> BufferedInputStream(fis))) {\n      <span class=\"hljs-keyword\">while<\/span> (<span class=\"hljs-keyword\">true<\/span>) {\n        Object o = in.readObject();\n        System.out.println(<span class=\"hljs-string\">\"o.class = \"<\/span> + o.getClass() + <span class=\"hljs-string\">\"; o = \"<\/span> + o);\n      }\n    } <span class=\"hljs-keyword\">catch<\/span> (EOFException ex) {\n      System.out.println(<span class=\"hljs-string\">\"EOF\"<\/span>);\n    }\n  }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-21\"><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 class=\"wp-block-paragraph\">Die Ausgabe des Programms lautet:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-22\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">o.class = class java.lang.String; o = Hello World \u00e4\u00f6\u00fc \u00df \u03b1 \u20ac \u2196 ?\no.class = class java.util.ArrayList; o = &#091;42, 47, 74]\no.class = class java.util.ImmutableCollections$List12; o = &#091;Hello, World]\nEOF<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-22\"><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 class=\"wp-block-paragraph\">Wie du siehst, m\u00fcssen wir hier die Struktur der Datei, d. h. welche Objekttypen sie in welcher Reihenfolge enth\u00e4lt, nicht kennen. <code>ObjectOutputStream<\/code> schreibt die jeweiligen Klassen mit in die Datei und <code>ObjectInputStream<\/code> legt die entsprechenden Objekte wieder an.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Eine Besonderheit m\u00fcssen wir bei <code>ObjectInputStream<\/code> beachten: Im <em>try-with-resources<\/em>-Block ist es an dieser Stelle essenziell sowohl <code>FileInputStream<\/code> als auch <code>ObjectInputStream<\/code> je einer Variablen zuzuweisen. Folgendes w\u00e4re syntaktisch zwar korrekt, semantisch aber falsch:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-23\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">var<\/span> out = <span class=\"hljs-keyword\">new<\/span> ObjectInputStream(<span class=\"hljs-keyword\">new<\/span> BufferedInputStream(\n      <span class=\"hljs-keyword\">new<\/span> FileInputStream(<span class=\"hljs-string\">\"objects1.bin\"<\/span>)));<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-23\"><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 class=\"wp-block-paragraph\">Der Grund ist, dass der <code>ObjectInputStream<\/code>-Konstruktor eine <code>IOException<\/code> werfen kann. Dies passiert, wenn die Bin\u00e4rdatei nicht von einem <code>ObjectOutputStream<\/code> geschrieben wurde, somit also von <code>ObjectInputStream<\/code> nicht gelesen werden kann. Im Fall einer Exception w\u00fcrde der (zuvor ge\u00f6ffnete) <code>FileInputStream<\/code> nicht automatisch geschlossen werden, da nur Objekte geschlossen werden, die im try-Block einer Variablen zugewiesen werden.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"fortgeschrittene-themen-der-objekt-serialisierung-und-deserialisierung\">Fortgeschrittene Themen der Objekt-Serialisierung und -Deserialisierung<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>ObjectOutputStream<\/code> und <code>ObjectInputStream<\/code> sind noch weitaus m\u00e4chtiger als hier gezeigt. Ihre Funktion \u2013 die Serialisierung und Deserialisierung von Java-Objekten \u2013 findet nicht nur im Kontext von Dateioperationen Anwendung, sondern beispielsweise auch bei verteilten In-Memory-Caches oder bei Remote Method Invocation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Da dies kein Tutorial \u00fcber die Serialisierung und Deserialisierung von Java-Objekten sein soll, gehe ich hier nicht weiter ins Detail (wie \"back references\", <code>writeUnshared()<\/code>, <code>readUnshared()<\/code>, <code>writeObject()<\/code>, <code>readObject()<\/code>, usw.). Ich werde nach Abschluss der Artikelserie \u00fcber Dateien ein ausf\u00fchrliches Tutorial zu diesen fortgeschrittenen Serialisierungsthemen schreiben.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"zusammenfassung-und-ausblick\">Zusammenfassung und Ausblick<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In diesem Artikel hast du gesehen, wie du mit <code>DataOutputStream<\/code> und <code>DataInputStream<\/code> primitive Datentypen und Strings in Dateien schreiben und aus ihnen lesen kannst, und wie du mit <code>ObjectOutputStream<\/code> und <code>ObjectInputStream<\/code> komplexe Java-Objekte schreiben und lesen kannst.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>ObjectOutputStream<\/code> und <code>ObjectInputStream<\/code> haben wir dabei nur oberfl\u00e4chlich betrachtet. Fortgeschrittenen Serialisierungsthemen werde ich in einem separaten Artikel behandeln.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Im n\u00e4chsten und letzten Artikel stelle ich dir die in Java 1.4 eingef\u00fchrten <a href=\"https:\/\/www.happycoders.eu\/de\/java\/filechannel-memory-mapped-io-locks\/\">FileChannel und ByteBuffer<\/a> vor. Diese beschleunigen (bei Verwendung von direkten Buffern) insbesondere das Arbeiten mit sehr gro\u00dfen Dateien, erlauben das <a href=\"https:\/\/www.happycoders.eu\/de\/java\/filechannel-memory-mapped-io-locks\/#File_Locking_Sperren_von_Dateibereichen\">Sperren von Dateibereichen (\"File locks\")<\/a> und das <a href=\"https:\/\/www.happycoders.eu\/de\/java\/filechannel-memory-mapped-io-locks\/#Memory-mapped_Files_Wie_man_einen_Teil_einer_Datei_in_den_Speicher_mappt\">Mappen von Dateien in den Speicher (\"memory-mapped files\")<\/a>, um auf diese so einfach wie auf Byte-Arrays zuzugreifen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn dir dieser Artikel gefallen hat, dann teile ihn gerne \u00fcber einen der Share-Buttons unten. Wenn du informiert werden m\u00f6chtest, wenn der n\u00e4chste Teil ver\u00f6ffentlicht wird, <a href=\"#\" data-formkit-toggle=\"d8ee997126\">klicke hier<\/a>, um dich f\u00fcr den HappyCoders-Newsletter anzumelden.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In diesem f\u00fcnften Teil der Reihe lernst du, wie du strukturierte Daten mit DataOutputStream, DataInputStream, ObjectOutputStream und ObjectInputStream schreiben und lesen kannst.<\/p>\n","protected":false},"author":1,"featured_media":34418,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_seopress_titles_title":"","_seopress_titles_desc":"Wie schreibt man primitive Datentypen (int, long, char, ...) in Dateien und wie liest man sie wieder aus? DataOutputStream, DataInputStream.","_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":"DataOutputStream,DataInputStream","_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":21768,"_post_count":0,"footnotes":""},"categories":[64],"tags":[166],"class_list":["post-9586","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-java","tag-java-dateien"],"uagb_featured_image_src":{"full":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/java-structured-data-output-input-stream.jpg",1770,986,false],"thumbnail":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/java-structured-data-output-input-stream.jpg",150,84,false],"medium":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/java-structured-data-output-input-stream.jpg",300,167,false],"medium_large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/java-structured-data-output-input-stream.jpg",768,428,false],"large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/java-structured-data-output-input-stream.jpg",1024,570,false],"feature_thumb_224":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/java-structured-data-output-input-stream-224x125.jpg",224,125,true],"feature_thumb_336":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/java-structured-data-output-input-stream-336x187.jpg",336,187,true],"feature_thumb_504":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/java-structured-data-output-input-stream-504x281.jpg",504,281,true],"feature_thumb_672":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/java-structured-data-output-input-stream-672x374.jpg",672,374,true],"half_400":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/java-structured-data-output-input-stream-400x223.jpg",400,223,true],"half_600":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/java-structured-data-output-input-stream-600x334.jpg",600,334,true],"full_800":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/java-structured-data-output-input-stream-800x446.jpg",800,446,true],"full_944":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/java-structured-data-output-input-stream-944x526.jpg",944,526,true],"full_1200":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/java-structured-data-output-input-stream-1200x668.jpg",1200,668,true],"wide_1180":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/java-structured-data-output-input-stream-1180x490.jpg",1180,490,true],"wide_1770":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/java-structured-data-output-input-stream-1770x735.jpg",1770,735,true],"1536x1536":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/java-structured-data-output-input-stream.jpg",1536,856,false],"2048x2048":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/02\/java-structured-data-output-input-stream.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 f\u00fcnften Teil der Reihe lernst du, wie du strukturierte Daten mit DataOutputStream, DataInputStream, ObjectOutputStream und ObjectInputStream schreiben und lesen kannst.","public_identification_id":"40f8aa51741941bfb09428ccf824c11a","private_identification_id":"314357e5cdf140b999cf16ab50a68e40","_links":{"self":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/9586","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=9586"}],"version-history":[{"count":10,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/9586\/revisions"}],"predecessor-version":[{"id":41970,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/9586\/revisions\/41970"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media\/34418"}],"wp:attachment":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media?parent=9586"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/categories?post=9586"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/tags?post=9586"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}