Wie kann ich mit Node.js eine Datei asynchron lesen und schreiben?
- Einführung
- Asynchrones Lesen von Dateien mit fs.promises.readFile
- Asynchrones Schreiben von Dateien mit fs.promises.writeFile
- Kombinieren von Lesen und Schreiben
- Alternative: Asynchrone Methoden mit Callbacks
- Zusammenfassung
Einführung
In Node.js ermöglicht das integrierte fs-Modul das Arbeiten mit dem Dateisystem. Besonders wichtig ist dabei die Möglichkeit, Dateien asynchron zu lesen und zu schreiben. Asynchrones Arbeiten verhindert, dass der Node.js-Prozess während der Dateizugriffe blockiert wird, und sorgt für bessere Performance und Skalierbarkeit. Im Folgenden wird ausführlich erläutert, wie man das asynchrone Lesen und Schreiben mit fs realisiert.
Asynchrones Lesen von Dateien mit fs.promises.readFile
Ab Node.js Version 10 steht das fs.promises-API zur Verfügung, das Promise-basiert ist und das Arbeiten mit async/await erleichtert. Um eine Datei asynchron zu lesen, importiert man zuerst das Modul und verwendet dann die Methode readFile. Diese Methode bekommt mindestens einen Pfad zur Datei übergeben und kann optional auch die Zeichenkodierung bestimmen (zum Beispiel utf8, um den Inhalt als String zu erhalten).
const fs = require(fs).promises;async function leseDatei() { try { const inhalt = await fs.readFile(beispiel.txt, utf8); console.log(Dateiinhalt:, inhalt); } catch (fehler) { console.error(Fehler beim Lesen der Datei:, fehler); }}leseDatei();In diesem Beispiel wird die Datei beispiel.txt asynchron gelesen, und sobald der Inhalt verfügbar ist, wird er ausgegeben. Treten Fehler auf, zum Beispiel wenn die Datei nicht existiert, wird dieser im catch-Block abgefangen und geloggt.
Asynchrones Schreiben von Dateien mit fs.promises.writeFile
Analog zum Lesen funktioniert das Schreiben mit der Methode writeFile. Hier gibt man den Pfad der Datei sowie die Daten an, die geschrieben werden sollen. Die Daten können ein String oder ein Buffer sein. Auch hier erfolgt die Operation asynchron und lässt sich mit async/await darstellen. Fehler werden ebenfalls über try/catch behandelt.
const fs = require(fs).promises;async function schreibeDatei() { const daten = Das ist ein Beispieltext, der in die Datei geschrieben wird.; try { await fs.writeFile(ausgabe.txt, daten, utf8); console.log(Datei erfolgreich geschrieben.); } catch (fehler) { console.error(Fehler beim Schreiben der Datei:, fehler); }}schreibeDatei();Hier wird die Datei ausgabe.txt mit dem Text daten gefüllt. Falls ausgabe.txt nicht existiert, wird sie neu angelegt. Sollte sie bereits vorhanden sein, überschreibt writeFile den vorhandenen Inhalt.
Kombinieren von Lesen und Schreiben
Oft möchte man eine Datei lesen, etwas anpassen und das Ergebnis in eine andere Datei schreiben. Dies ist ebenfalls mit async/await und den fs.promises-Methoden einfach möglich. Das folgende Beispiel liest zunächst eine Datei, hängt einen Text an und schreibt den erweiterten Inhalt in eine neue Datei.
const fs = require(fs).promises;async function leseUndSchreibe() { try { const inhalt = await fs.readFile(input.txt, utf8); const neuerInhalt = inhalt + \nDieser Text wurde hinzugefügt.; await fs.writeFile(output.txt, neuerInhalt, utf8); console.log(Datei wurde erfolgreich gelesen, bearbeitet und gespeichert.); } catch (fehler) { console.error(Fehler beim Lesen oder Schreiben der Datei:, fehler); }}leseUndSchreibe();Auf diese Weise lassen sich einfache und elegante Dateioperationen durchführen, ohne den Node.js Event Loop zu blockieren. Dies ist besonders wichtig in produktiven Anwendungen, die viele Anfragen gleichzeitig bedienen müssen.
Alternative: Asynchrone Methoden mit Callbacks
Node.js bietet auch eine ältere Möglichkeit, asynchron zu arbeiten, nämlich über Callback-Funktionen. Dabei übergibt man der Methode readFile oder writeFile eine Funktion, die nach Abschluss der Operation aufgerufen wird. Diese Art der Programmierung wird heute jedoch oft durch Promises oder async/await ersetzt, da der Code dadurch übersichtlicher wird.
const fs = require(fs);fs.readFile(beispiel.txt, utf8, (err, data) => { if (err) { return console.error(Fehler beim Lesen:, err); } console.log(Dateiinhalt:, data); const text = data + \nNeue Zeile hinzugefügt; fs.writeFile(ausgabe.txt, text, utf8, (err) => { if (err) { return console.error(Fehler beim Schreiben:, err); } console.log(Datei wurde geschrieben); });});Dieses Beispiel ist funktional identisch mit den vorherigen, nutzt jedoch Callbacks anstelle von Promises.
Zusammenfassung
Das fs-Modul in Node.js stellt mehrere Methoden bereit, um asynchron Dateien zu lesen und zu schreiben. Die moderne und empfehlenswerte Methode basiert auf dem Promise-API von fs.promises und ermöglicht es, mittels async/await einfach und lesbar mit Dateien zu arbeiten, ohne den Event Loop zu blockieren. Für einfache Fälle und zur Abwärtskompatibilität kann auch das klassische Callback-API genutzt werden, wobei man hier mit Verschachtelungen und geringer Lesbarkeit rechnen muss.
