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

问题描述 投票:0回答:8

我正在尝试读取

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$ 
javascript file-io node.js
8个回答
756
投票

来自 文档:

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

这可以解释

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

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

196
投票

尝试:

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

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


145
投票

这在谷歌上排名很高,所以我想添加一些有关原始问题的上下文信息(强调我的):

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

因为文件并不总是文本

即使作为程序员的都知道:Node 不知道你正在尝试读取的文件中有什么内容。它可能是一个文本文件,但也可能是一个 ZIP 存档或 JPG 图像 — Node 不知道。

因为读取文本文件很棘手

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

有多种方法可以或多或少地“猜测”文本文件的字符编码(这就是文本编辑器在打开文件时所做的事情),但您通常不希望代码在没有明确指示的情况下依赖于猜测。 缓冲区来救援!

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

这就是返回的缓冲区:文件中原始字节的无主见容器。如何解释这些字节取决于开发人员。


61
投票

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

同步:

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



48
投票

如果你想要它在字符串中,你可以用

data.toString()

:

 进行转换

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



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



1
投票
"utf-8"

。如果未提及编码方案,则返回普通缓冲区。

    


-1
投票

© www.soinside.com 2019 - 2024. All rights reserved.