540 Stimmen

Warum gibt fs.readFile() von Node.js einen Puffer statt eines Strings zurück?

Ich versuche, den Inhalt von test.txt (das sich im selben Ordner wie der Javascript-Quellcode befindet) und zeigen Sie es mit diesem Code an:

var fs = require("fs");

fs.readFile("test.txt", function (err, data) {
    if (err) throw err;
    console.log(data);
});

Der Inhalt der test.txt wurde erstellt am nano :

Node.js readFile() testen

Und ich bekomme das hier:

Nathan-Camposs-MacBook-Pro:node_test Nathan$ node main.js
<Buffer 54 65 73 74 69 6e 67 20 4e 6f 64 65 2e 6a 73 20 72 65 61 64 46 69 6c 65 28 29>
Nathan-Camposs-MacBook-Pro:node_test Nathan$

763voto

davin Punkte 43431

Desde die Dokumente:

Wenn keine Kodierung angegeben ist, wird der Rohpuffer zurückgegeben.

Dies könnte eine Erklärung für die <Buffer ...> . Geben Sie eine gültige Kodierung an, zum Beispiel utf-8 als zweiten Parameter nach dem Dateinamen angeben. Zum Beispiel,

fs.readFile("test.txt", "utf8", function(err, data) {...});

198voto

hvgotcodes Punkte 114342

Versuchen Sie es:

    fs.readFile("test.txt", "utf8", function(err, data) {...});

Grundsätzlich müssen Sie die Kodierung angeben.

145voto

Loilo Punkte 11518

Da diese Frage bei Google weit oben erscheint, möchte ich einige kontextbezogene Informationen über die ursprüngliche Frage hinzufügen (Hervorhebung von mir):

Warum Gibt fs.readFile() von Node.js einen Puffer statt eines Strings zurück?

Weil Dateien nicht immer aus Text bestehen

Auch wenn Sie wie es der Programmierer kennt: Node hat keine Ahnung, was in der Datei steht, die Sie zu lesen versuchen. Es könnte eine Textdatei sein, aber genauso gut könnte es ein ZIP-Archiv oder ein JPG-Bild sein - Node weiß es nicht.

Weil das Lesen von Textdateien kompliziert ist

Auch wenn Node wusste eine Textdatei lesen würde, hätte es immer noch keine Ahnung, welche Zeichenkodierung verwendet wird (d. h. wie die Bytes in der Datei auf für Menschen lesbare Zeichen abgebildet werden), da die Zeichenkodierung selbst nicht in der Datei gespeichert ist.

Es gibt Möglichkeiten, um erraten die Zeichenkodierung von Textdateien mit mehr oder weniger Zuversicht (das tun Texteditoren beim Öffnen einer Datei), aber Sie wollen normalerweise nicht, dass sich Ihr Code ohne Ihre ausdrücklichen Anweisungen auf Vermutungen verlässt.

Puffer zur Rettung!

Da er all diese Details nicht kennt und auch nicht kennen kann, liest Node die Datei einfach Byte für Byte, ohne etwas über ihren Inhalt anzunehmen.

Und genau das ist der zurückgegebene Puffer: ein reiner Container für die unbearbeiteten Bytes in der Datei. Wie diese Bytes interpretiert werden sollen, bleibt Ihnen als Entwickler überlassen.

61voto

wangchi Punkte 2835

Asynchron:

fs.readFile('test.txt', 'utf8', callback);

Sync:

var content = fs.readFileSync('test.txt', 'utf8');

48voto

Andz Punkte 2176

Es wird ein Buffer-Objekt zurückgegeben.

Wenn Sie es in eine Zeichenkette umwandeln wollen, können Sie es mit data.toString() :

var fs = require("fs");

fs.readFile("test.txt", function (err, data) {
    if (err) throw err;
    console.log(data.toString());
});

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X