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

Nat*_*pos 323 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);
});
Run Code Online (Sandbox Code Playgroud)

该内容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$ 
Run Code Online (Sandbox Code Playgroud)

dav*_*vin 472

来自文档:

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

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

fs.readFile("test.txt", "utf8", function(err, data) {...});
Run Code Online (Sandbox Code Playgroud)


hvg*_*des 156

尝试

fs.readFile("test.txt", "utf8", function(err, data) {...});
Run Code Online (Sandbox Code Playgroud)

基本上你需要指定编码.


Blu*_*ari 40

异步:

fs.readFile('test.txt', 'utf8', callback);
Run Code Online (Sandbox Code Playgroud)

同步:

var content = fs.readFileSync('test.txt', 'utf8');
Run Code Online (Sandbox Code Playgroud)


Loi*_*ilo 37

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

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

因为文件并不总是文本

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

因为阅读文本文件很棘手

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

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

努力救援!

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

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

  • 这是实际上“回答”标题中的问题的唯一答案。 (2认同)
  • @frzsombor鉴于有一个可接受的答案,我认为OP确实*对*想要获取字符串而不是Buffers感兴趣,只是无法正确地表达问题。不过,其他人可能会想到Google来这里就是真正的“为什么”,因此是我的答案。:) (2认同)

And*_*ndz 35

它返回一个Buffer对象.

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

var fs = require("fs");

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

  • 有点旧,但应该知道这个解决方案引入了额外的开销,因为`buffer.toString()`无论如何都采用utf-8编码.因此,这将与@hvgotcodes的答案相同(但速度慢). (13认同)

ayu*_*sha 14

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

data.toString('ascii', 0, data.length)
Run Code Online (Sandbox Code Playgroud)

异步:

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