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

378

Ich versuche, den Inhalt von test.txt(der sich im selben Ordner der Javascript-Quelle befindet) zu lesen und ihn mit folgendem Code anzuzeigen:

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:

Testen von Node.js readFile ()

Und ich bekomme das:

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$ 
Nathan Campos
quelle

Antworten:

561

Aus den Dokumenten:

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

Welches könnte das erklären <Buffer ...>. Geben Sie beispielsweise eine gültige Codierung utf-8als zweiten Parameter nach dem Dateinamen an. Sowie,

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

Versuchen

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

Grundsätzlich müssen Sie die Codierung angeben.

hvgotcodes
quelle
66

Dies kommt bei Google sehr gut an, daher möchte ich einige kontextbezogene Informationen zur ursprünglichen Frage hinzufügen (Hervorhebung von mir):

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

Weil Dateien nicht immer Text sind

Auch wenn Sie als Programmierer es wissen: Node hat keine Ahnung, was in der Datei enthalten ist, die Sie lesen möchten. Es könnte eine Textdatei sein, aber es könnte genauso gut ein ZIP-Archiv oder ein JPG-Bild sein - Node weiß es nicht.

Weil das Lesen von Textdateien schwierig ist

Selbst wenn Node wüsste, dass es eine Textdatei lesen würde, hätte er immer noch keine Ahnung, welche Zeichen codiert werden verwendet wird (dh wie die Bytes in der Datei lesbaren Zeichen zugeordnet werden), da die Zeichenkodierung selbst nicht in der Datei gespeichert ist .

Es gibt Möglichkeiten zu erraten die Zeichenkodierung von Textdateien mehr oder weniger sicher (das tun Texteditoren beim Öffnen einer Datei), aber Sie möchten normalerweise nicht, dass sich Ihr Code ohne Ihre ausdrückliche Anweisung auf Vermutungen stützt.

Puffer zur Rettung!

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

Und genau das ist der zurückgegebene Puffer: ein nicht mit Leidenschaft versehener Container für binären Rohinhalt. Wie dieser Inhalt interpretiert werden soll, liegt bei Ihnen als Entwickler.

Loilo
quelle
10
Dies ist die einzige Antwort, die die Frage im Titel tatsächlich beantwortet .
Frzsombor
4
@frzsombor In Anbetracht , dass es eine akzeptierte Antwort, würde ich die OP übernehmen wirklich wurde in immer Strings statt Puffer interessiert und konnte es einfach nicht Phrase die Frage richtig. Trotzdem könnten andere Leute von Google mit dem eigentlichen "Warum" hierher kommen, daher meine Antwort. :)
Loilo
44

Async:

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

Synchronisieren:

var content = fs.readFileSync('test.txt', 'utf8');
Taro Alan
quelle
38

Es wird ein Pufferobjekt zurückgegeben.

Wenn Sie es in einer Zeichenfolge möchten, können Sie es konvertieren mit data.toString():

var fs = require("fs");

fs.readFile("test.txt", function (err, data) {
    if (err) throw err;
    console.log(data.toString());
});
Andz
quelle
13
Ein bisschen alt, aber es sollte bekannt sein, dass diese Lösung zusätzlichen Overhead verursacht, da buffer.toString()ohnehin die utf-8-Codierung vorausgesetzt wird. Dies wäre also gleichbedeutend mit der Antwort von @hvgotcodes (wenn auch langsamer als diese).
Brandon
14

Die dataVariable enthält ein BufferObjekt. Konvertieren Sie es mit der folgenden Syntax in ASCII-Codierung:

data.toString('ascii', 0, data.length)

Asynchron:

fs.readFile('test.txt', 'utf8', function (error, data) {
    if (error) throw error;
    console.log(data.toString());
});
Ayusha
quelle