{"id":4466,"date":"2024-03-28T16:00:00","date_gmt":"2024-03-28T16:00:00","guid":{"rendered":"https:\/\/msgprogramator.sk\/?p=4466"},"modified":"2025-07-07T11:36:28","modified_gmt":"2025-07-07T11:36:28","slug":"java-dateien-schreiben","status":"publish","type":"post","link":"https:\/\/msgprogramator.sk\/de\/java-dateien-schreiben\/","title":{"rendered":"Arbeiten mit Java-Dateien Teil 2: Wie man Dateien schnell und effizient schreibt"},"content":{"rendered":"<p>Wenn du unseren vorherigen Artikel <strong><a href=\"https:\/\/msgprogramator.sk\/de\/arbeiten-mit-java-dateien\/\">Wie man Dateien in Java schnell und effizient liest<\/a><\/strong> gelesen hast, wei\u00dft du bereits, dass es viele verschiedene M\u00f6glichkeiten gibt, Dateien in Java zu lesen. Abh\u00e4ngig von der Art und Gr\u00f6\u00dfe der Datei muss der richtige Ansatz gew\u00e4hlt werden, da es sonst passieren kann, dass das Einlesen der Datei unn\u00f6tig lange dauert. \u00c4hnlich gibt es viele M\u00f6glichkeiten, wie du Daten in Java in eine Datei schreiben kannst. Bestimmte Implementierungen k\u00f6nnen f\u00fcr eine L\u00f6sung besser geeignet sein als andere, je nach Art und Menge der Daten, die du in die Datei schreibst. Beim Schreiben in eine Datei m\u00fcssen wir im Voraus wissen, ob wir unsere Daten in eine Text- oder Bin\u00e4rdatei schreiben werden. Im Fall einer Textdatei werden wir uns auf die Verwendung von Klassen wie <strong><em>Files, Writer, OutputStreamWriter, FileWriter, PrintWriter und BufferedWriter<\/em><\/strong> konzentrieren. Bei Bin\u00e4rdateien verwenden wir eher Klassen wie <strong><em>OutputStream, FileOutputStream, BufferedOutputStream, <\/em><\/strong><strong><em>ByteOutputStream und DataOutputStream<\/em><\/strong> zum Schreiben. Es gibt auch externe Drittanbieter-Bibliotheken f\u00fcr die Arbeit mit Dateien, auf die wir heute jedoch nicht eingehen werden. Jede der oben genannten Klassen f\u00fcr die Arbeit mit Dateien hat ihren spezifischen Anwendungsfall. Im Allgemeinen gilt jedoch, dass wir zum Schreiben von Bin\u00e4rdaten die <strong><em>OutputStream-Klassen<\/em><\/strong> und f\u00fcr Textdaten die <strong><em>Writer<\/em><\/strong>-Klassen verwenden. Die meisten vordefinierten Klassen zum Lesen und Schreiben von Dateien in Java befinden sich in den Paketen <strong>java.io<\/strong> und <strong>java.nio.file<\/strong>. Mit der Einf\u00fchrung der neuen API-Schnittstelle f\u00fcr Dateien, Java NIO.2 (New I\/O), hat sich die Situation noch weiter kompliziert, und selbst erfahrene Programmierer fragen h\u00e4ufig in Entwicklerforen, wie man effizient und schnell mit Dateien arbeitet. Das Schreiben von Daten in Java kann ebenfalls kompliziert werden. Daher konzentrieren wir uns in unserem Artikel auf zwei grundlegende Szenarien beim Schreiben von Daten, die 90 Prozent der Anwendungsf\u00e4lle abdecken, und zwar: <\/p>\n<ul>\n<li>Der einfachste Weg, einmal in Bin\u00e4r- und Textdateien zu schreiben.<\/li>\n<li>Kontinuierliches Schreiben in eine Datei in Teilen<\/li>\n<\/ul>\n<p> Java 7 brachte das lang erwartete <em>NIO.2 File API <\/em>die neben vielen Funktionen auch eine Hilfsklasse <strong>java.nio.file.Files<\/strong> mitbrachte, mit der man ein Byte-Array, eine Zeichenkette (String) oder eine Liste von Zeichenketten mit einem einzigen Befehl in eine Text-\/Bin\u00e4rdatei schreiben kann. <\/p>\n<h2>Schreiben eines Byte-Arrays in eine Bin\u00e4rdatei<\/h2>\n<p> Ein Byte-Array kannst du wie folgt in eine Datei schreiben: <\/p>\n<pre><code class=\"language-java\" data-line=\"\">import java.nio.file.Files;\nimport java.nio.file.Path;\n\nString fileName = &quot;fileName.dat&quot;;\nbyte[] data = {72, 101, 108, 108, 111};\nFiles.write(Path.of(fileName), data);\n<\/code><\/pre>\n<p> Die Klasse <em>Path <\/em> (verf\u00fcgbar seit Java 11) stellt eine Abstraktion einer Datei dar und enth\u00e4lt den Pfad zur Datei im Dateisystem. <\/p>\n<h2>Schreiben einer String-Variable in eine Textdatei<\/h2>\n<p> Das Schreiben einer String-Variable in eine Datei ab Java 11 ist sehr einfach: <\/p>\n<pre><code class=\"language-java\" data-line=\"\">import java.nio.file.Files;\nimport java.nio.file.Path;\n\nString fileName = &quot;fileName.txt&quot;;\nString text = &quot;Hello&quot;;\nFiles.writeString(Path.of(fileName), text);\n<\/code><\/pre>\n<h2>Schreiben einer Liste von String-Variablen in eine Textdatei<\/h2>\n<p> Oft schreiben wir nicht nur eine Zeile in eine Textdatei, sondern mehrere Zeilen auf einmal. Mit dem folgenden Befehl kannst du eine Liste (bzw. genauer gesagt   <em>&lt;Iterable ? extends CharSequence &gt;<\/em>) in eine Textdatei schreiben. <\/p>\n<pre><code class=\"language-java\" data-line=\"\">import java.nio.file.Files;\nimport java.nio.file.Path;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\n\nString fileName = &quot;fileName.txt&quot;;\nList&lt;String&gt; lines = new ArrayList&lt;&gt;(Arrays.asList(&quot;msg&quot;, &quot;life&quot;));\nFiles.write(Path.of(fileName), lines);\n<\/code><\/pre>\n<h2>Schreiben in eine Textdatei mit String stream<\/h2>\n<p> Es gibt keine Methode, die direkt aus dem String-Stream in die Datei schreibt, aber es gibt einen kleinen Trick, mit dem Sie dies erreichen k\u00f6nnen: <\/p>\n<pre><code class=\"language-java\" data-line=\"\">import java.nio.file.Files;\nimport java.nio.file.Path;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.stream.Stream;\n\nString fileName = &quot;fileName.txt&quot;;\nStream&lt;String&gt; lines = new ArrayList&lt;&gt;(Arrays.asList(&quot;msg&quot;, &quot;life&quot;)).stream();\nFiles.write(Path.of(fileName), (Iterable&lt;String&gt;) lines::iterator);<\/code><\/pre>\n<p> Wir verwenden die Methode <em>Files.write(),<\/em> \u00e4hnlich wie im vorherigen Beispiel, jedoch akzeptiert diese nur Argument <em>Iterable&lt; String&gt;<\/em> Der Stream selbst ist in Java 8 nicht iterierbar, da er nur einmal aufgerufen werden kann (wiederholte Aufrufe w\u00fcrden zu einer <em>IllegalStateException<\/em> f\u00fchren). Kann daher nicht als Parameter verwendet werden. Es gibt jedoch das funktionale Interface <em>Iterable<\/em>, dessen einzige Methode einen <em>Iterator <\/em> zur\u00fcckgibt. Daher k\u00f6nnen wir einen Verweis auf die Methode <em>lines.iterator()<\/em> \u00fcbergeben, die ebenfalls einen <em>Iterator <\/em> als Iterable zur\u00fcckgibt. V tejto \u010dasti sme sa zozn\u00e1mili s pomocn\u00fdmi met\u00f3dami triedy <em>java.nio.file.Files<\/em>. Diese Methoden sind f\u00fcr alle Anwendungsf\u00e4lle geeignet, in denen die Daten, die wir in eine Datei schreiben m\u00f6chten, vollst\u00e4ndig im Speicher gespeichert sind und ihr Umfang nur einige Kilobyte betr\u00e4gt. In anderen F\u00e4llen, insbesondere wenn wir wiederholt in Teile in eine Datei schreiben, ist es besser, eine der vordefinierten <em>OutputStream<\/em>-Klassen zu verwenden Im n\u00e4chsten Abschnitt erkl\u00e4ren wir, wie man das macht. <\/p>\n<h2>Schnelles Schreiben in Bin\u00e4rdateien mit BufferedOutputStream<\/h2>\n<p> Die Hauptklasse zum Schreiben von Bin\u00e4rdaten in eine Datei ist <strong><em>FileOutputStream<\/em><\/strong>, die es erm\u00f6glicht, Byte f\u00fcr Byte oder ein Byte-Array in die Datei zu schreiben. Das Schreiben einzelner Bytes ist eine sehr kostenintensive Operation, daher empfehlen wir, einen Puffer zu verwenden und das Schreiben in die Datei in Bl\u00f6cken (sogenanntes Buffering) durchzuf\u00fchren, was deutlich schneller ist. Auf den meisten Systemen betr\u00e4gt die optimale Puffergr\u00f6\u00dfe 8 KB, weshalb Java diesen Wert als Standard verwendet. F\u00fcr den gepufferten Schreibvorgang verwenden wir die Klasse <strong><em>BufferedOutputStream<\/em><\/strong> wie folgt. <\/p>\n<pre><code class=\"language-java\" data-line=\"\">import java.io.BufferedOutputStream;\nimport java.io.FileOutputStream;\n\nString fileName = &quot;fileName.dat&quot;;\nbyte[] bytes;\ntry (FileOutputStream out = new FileOutputStream(fileName);\n     BufferedOutputStream bout = new BufferedOutputStream(out)) {\n    while((bytes = getOutputData()) != -1) {\n        bout.write(bytes);\n    }\n}\n<\/code><\/pre>\n<p> In diesem Beispiel gibt die Methode <em>getOuputData()<\/em> (ihre Implementierung ist nicht wichtig) die Teile der Datei zur\u00fcck, die sequentiell geschrieben werden. <\/p>\n<h2>Schnelles Schreiben in Textdateien mit BufferedWriter<\/h2>\n<p> Um Text in eine Datei zu schreiben, muss der Text zuerst in Bin\u00e4rdaten konvertiert werden. F\u00fcr die Konvertierung von Zeichen in Bytes ist die Klasse <strong><em>OutputStreamWriter<\/em><\/strong> verantwortlich. Die Klasse <strong><em>FileWriter<\/em><\/strong> kombiniert <strong><em>FileOutputStream<\/em><\/strong> und <strong><em>OutputStreamWriter<\/em><\/strong>. F\u00fcr schnelleres Schreiben von Dateien verwenden wir die Klasse <strong><em>BufferedWriter<\/em><\/strong>, die die Klasse <strong><em>FileWriter<\/em><\/strong> umschlie\u00dft und einen 8 KB Puffer zusammen mit einem zus\u00e4tzlichen Puffer f\u00fcr kodierte Zeichen erm\u00f6glicht.<\/p>\n<pre><code class=\"language-java\" data-line=\"\">import java.io.BufferedWriter;\nimport java.io.FileWriter;\n\nString fileName = &quot;fileName.txt&quot;;\ntry (FileWriter writer = new FileWriter(fileName);\n     BufferedWriter bufferedWriter = new BufferedWriter(writer)) {\n    String line;\n    while ((line = getLine()) != -1) {\n        bufferedWriter.write(line);\n    }\n}\n<\/code><\/pre>\n<p> In diesem Beispiel gibt die Methode <em>getLine()<\/em> (deren Implementierung nicht wichtig ist) die Zeilen einer Datei zur\u00fcck, die schrittweise geschrieben wird. In den vorherigen Beispielen haben wir die erstellten Streams nicht geschlossen. Nach Verlassen des <strong>Try-Blocks<\/strong> wird die <em>close()<\/em> -Methode automatisch aufgerufen, um beide Streams zu schlie\u00dfen, so dass dies nicht explizit angegeben oder ben\u00f6tigt wird. <\/p>\n<h2>Fazit<\/h2>\n<p> In diesem Artikel haben wir die h\u00e4ufigsten Szenarien f\u00fcr das Schreiben von Daten in eine Datei gezeigt. Kleinere Dateien, die wir im Speicher vorbereitet haben, k\u00f6nnen mit Methoden der Klasse <strong><em>Dateien<\/em><\/strong> Methoden geschrieben werden, und gr\u00f6\u00dfere Dateien schreiben wir st\u00fcckweise mit Hilfe des Caches.  Wenn du ein <a href=\"https:\/\/msg-life.sk\/de\/stellenangebote\/java-entwickler-senior\/\">Java Programmierer<\/a> bist und nach Arbeit suchst, schau dir unsere <a href=\"https:\/\/msg-life.sk\/de\/mitarbeiter-benefits\/\">Mitareiterbenefits <\/a> an und reagiere auf die <a href=\"https:\/\/msg-life.sk\/de\/stellenangebote\/\">neuesten Stellenangebote.<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In Java gibt es viele M\u00f6glichkeiten, Daten in Dateien zu schreiben. In diesem Artikel werden wir verschiedene Klassen mit Codebeispielen vorstellen. <\/p>\n","protected":false},"author":14,"featured_media":3024,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[62],"tags":[],"class_list":["post-4466","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-java"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/posts\/4466","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/users\/14"}],"replies":[{"embeddable":true,"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/comments?post=4466"}],"version-history":[{"count":4,"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/posts\/4466\/revisions"}],"predecessor-version":[{"id":8024,"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/posts\/4466\/revisions\/8024"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/media\/3024"}],"wp:attachment":[{"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/media?parent=4466"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/categories?post=4466"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/msgprogramator.sk\/de\/wp-json\/wp\/v2\/tags?post=4466"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}