Почему в Node.js функция fs.readFile () возвращает буфер вместо строки? - PullRequest
287 голосов
/ 23 июня 2011

Я пытаюсь прочитать содержимое test.txt (которое находится в той же папке источника Javascript) и отобразить его, используя следующий код:

var fs = require("fs");

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

Содержимое test.txtбыл создан в nano:

Проверка Node.js readFile ()

И я получаю это:

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$ 

Ответы [ 6 ]

426 голосов
/ 23 июня 2011

С документы:

Если кодировка не указана, возвращается необработанный буфер.

Что может объяснить <Buffer ...>.Укажите правильную кодировку, например utf-8, в качестве второго параметра после имени файла.Например,

fs.readFile("test.txt", "utf8", function(err, data) {...});
151 голосов
/ 23 июня 2011

try

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

в основном вам нужно указать кодировку.

32 голосов
/ 23 июня 2011

Возвращается объект Buffer.

Если вы хотите, чтобы он был в строке, вы можете преобразовать его с помощью data.toString():

var fs = require("fs");

fs.readFile("test.txt", function (err, data) {
    if (err) throw err;
    console.log(data.toString());
});
31 голосов
/ 18 июля 2016

Асинхронный:

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

Синхронизация:

var content = fs.readFileSync('test.txt', 'utf8');
27 голосов
/ 11 апреля 2018

Это высоко ценится в Google, поэтому я хотел бы добавить некоторую контекстную информацию об исходном вопросе (выделение мое):

Почему возвращает fs.readFile () файла Node.js вместо строки?

Поскольку файлы не всегда текстовые

Даже если вы , как это знает программист: Node не знает, что находится в файле, который вы пытаетесь прочитать. Это может быть текстовый файл, но это также может быть ZIP-архив или изображение в формате JPG - Node не знает.

Поскольку читать текстовые файлы сложно,

Даже если бы Узел знал , что он должен был читать текстовый файл, он все равно не знал бы, какая кодировка символов используется (т. Е. Как байты в файле отображаются на читаемые символы), поскольку сама кодировка символов не сохраняется в файле.

Есть способы угадать кодировку символов текстовых файлов с большей или меньшей уверенностью (это то, что текстовые редакторы делают при открытии файла), но обычно вы не хотите, чтобы ваш код полагался на догадки без вашего явного указания.

Буферы на помощь!

Итак, поскольку он не знает и не может знать все эти детали, Node просто читает байт файла за байтом, не предполагая ничего о его содержимом.

И вот что представляет собой возвращаемый буфер: неочищенный контейнер для необработанного двоичного содержимого. Как этот контент следует интерпретировать, решать вам как разработчику.

13 голосов
/ 18 июня 2014

Переменная data содержит объект Buffer. Преобразуйте его в кодировку ASCII, используя следующий синтаксис:

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

Асинхронный:

fs.readFile('test.txt', 'utf8', function (error, data) {
    if (error) throw error;
    console.log(data.toString());
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...