为什么Node.js'fs.readFile()返回一个缓冲区而不是字符串?

我试图读取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$
369779 次浏览

文档:

如果没有指定编码,则返回原始缓冲区。

这可能解释了<Buffer ...>。指定一个有效的编码,例如utf-8,作为文件名之后的第二个参数。例如,

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

试一试:

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

基本上,您需要指定编码。

它返回一个Buffer对象。

如果你想要它在字符串中,你可以用data.toString()转换它:

var fs = require("fs");


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

data变量包含一个Buffer对象。使用以下语法将其转换为ASCII编码:

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

UTF-8编码:

data = data.toString('utf8', 0, data.length)

异步:

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

异步:

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

同步:

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

这在谷歌上的位置很高,所以我想添加一些关于原始问题的上下文信息(重点是我的):

<强> < /为什么强烈> Node.js的fs.readFile()返回一个缓冲区而不是字符串?

因为文件并不总是文本

即使程序员知道: Node也不知道你试图读取的文件中有什么。它可以是一个文本文件,也可以是一个ZIP归档文件或JPG图像——Node不知道。

因为读取文本文件很棘手

即使节点知道要读取一个文本文件,它仍然不知道使用了哪个字符编码(即文件中的字节如何映射到人类可读的字符),因为字符编码本身并没有存储在文件中。

有一些方法可以或多或少地猜一猜文本文件的字符编码(这是文本编辑器在打开文件时所做的),但你通常不希望你的代码在没有显式指令的情况下依赖猜测。

缓冲器来拯救!

因此,由于Node不知道也不可能知道所有这些细节,它只是逐字逐字地读取文件,而不对其内容进行任何假设。

这就是返回的缓冲区:文件中原始字节的一个未对齐的容器。如何解释这些字节取决于作为开发人员的您。

您在第二个参数处丢失了编码方案,通常是"utf-8"。如果没有提到编码方案,则返回普通缓冲区。

如果它不是一个媒体文件,那么你可以使用. tostring()方法。