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

时间:2011-06-23 15:44:29

标签: javascript file-io node.js

我正在尝试阅读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$ 

7 个答案:

答案 0 :(得分:407)

来自the docs:

  

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

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

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

答案 1 :(得分:150)

尝试

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

基本上你需要指定编码。

答案 2 :(得分:32)

它返回一个Buffer对象。

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

var fs = require("fs");

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

答案 3 :(得分:31)

异步:

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

同步:

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

答案 4 :(得分:22)

这在Google上很高,所以我想添加一些关于原始问题的背景信息(强调我的):

  

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

因为文件不总是文本

即使作为程序员知道它:Node也不知道你想要读取的文件中有什么。它可能是一个文本文件,但它也可能是一个ZIP存档或JPG图像 - 节点不知道。

因为阅读文本文件很棘手

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

guess方式cheerio文本文件的字符编码或多或少有信心(这是文本编辑在打开文件时所做的事情),但是你通常不希望你的代码依赖猜测而没有你的明确指示。

努力救援!

因此,因为它不能并且不能知道所有这些细节,Node只是为字节读取文件字节,而不假设其内容。

这就是返回的缓冲区:原始二进制内容的未暂定容器。如何解释这些内容取决于您作为开发人员。

答案 5 :(得分:12)

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());
});

答案 6 :(得分:0)

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