Perché fs.readFile () di Node.js restituisce un buffer anziché una stringa?


379

Sto provando a leggere il contenuto di test.txt(che si trova nella stessa cartella della sorgente Javascript) e visualizzarlo utilizzando questo codice:

var fs = require("fs");

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

Il contenuto di è test.txtstato creato su nano:

Test di Node.js readFile ()

E sto ottenendo questo:

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$ 

Risposte:


562

Dai documenti:

Se non viene specificata alcuna codifica, viene restituito il buffer non elaborato.

Il che potrebbe spiegare il <Buffer ...>. Specificare una codifica valida, ad esempio utf-8, come secondo parametro dopo il nome file. Ad esempio,

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

165

provare

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

in pratica è necessario specificare la codifica.


67

Questo arriva in alto su Google, quindi vorrei aggiungere alcune informazioni contestuali sulla domanda originale (enfasi sulla mia):

Perché fs.readFile () di Node.js restituisce un buffer anziché una stringa?

Perché i file non sono sempre di testo

Anche se si come il programmatore lo sanno: Nodo ha idea di cosa c'è nella file che si sta cercando di leggere. Potrebbe essere un file di testo, ma potrebbe anche essere un archivio ZIP o un'immagine JPG - Il nodo non lo sa.

Perché leggere i file di testo è complicato

Anche se Node sapesse che avrebbe dovuto leggere un file di testo, non avrebbe ancora idea di quale codifica dei caratteri venga utilizzata (ovvero come i byte nella mappa vengono mappati a caratteri leggibili dall'uomo), poiché la codifica dei caratteri non viene memorizzata nel file .

Esistono modi per indovinare la codifica dei caratteri dei file di testo con maggiore o minore sicurezza (è ciò che fanno gli editor di testo quando si apre un file), ma di solito non si desidera che il codice si basi su ipotesi senza le istruzioni esplicite.

Buffer in soccorso!

Pertanto, poiché non conosce e non è in grado di conoscere tutti questi dettagli, Nodo legge semplicemente il byte del file per byte, senza presupporre nulla sul suo contenuto.

Ed è quello che è il buffer restituito: un contenitore nonopinionated per contenuto binario non elaborato. Come deve essere interpretato questo contenuto dipende da te come sviluppatore.


11
Questa è l'unica risposta che in realtà risponde alla domanda nel titolo.
frzsombor,

4
@frzsombor Dato che c'è una risposta accettata, suppongo che l'OP fosse davvero interessato a ottenere stringhe invece di Buffer e non riuscivo a pronunciare la domanda nel modo giusto. Tuttavia, altre persone potrebbero venire qui da Google pensando al vero "perché", quindi alla mia risposta. :)
Loilo,

44

Async:

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

Sync:

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

38

Restituisce un oggetto Buffer.

Se lo vuoi in una stringa, puoi convertirlo con data.toString():

var fs = require("fs");

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

13
Un po 'vecchio, ma dovrebbe essere noto che questa soluzione introduce un overhead extra poiché buffer.toString()presuppone comunque la codifica utf-8. Pertanto, ciò equivarrebbe alla risposta (sebbene, più lenta di) alla @hvgotcodes.
Brandon,

14

La datavariabile contiene un Bufferoggetto. Convertilo in codifica ASCII usando la sintassi seguente:

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

in modo asincrono:

fs.readFile('test.txt', 'utf8', function (error, data) {
    if (error) throw error;
    console.log(data.toString());
});
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.