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

hyrbngr7  于 2023-01-25  发布在  Node.js
关注(0)|答案(8)|浏览(266)

我正在尝试读取test.txt的内容(位于Javascript源代码的同一文件夹中),并使用以下代码显示它:

var fs = require("fs");

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

test.txt的内容是在nano上创建的:
测试节点. js读取文件()
我得到了这个:

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$
vdgimpew

vdgimpew1#

来自文档:
如果未指定编码,则返回原始缓冲区。
这可能解释了<Buffer ...>。指定一个有效的编码,例如utf-8,作为文件名后面的第二个参数。例如,

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

whlutmcx2#

试试看:

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

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

crcmnpdw

crcmnpdw3#

这在Google上很常见,所以我想补充一些关于原始问题的上下文信息(强调是我的):

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

因为文件并不总是文本

即使 * 你 * 作为程序员知道它:Node不知道你要读的文件里有什么,它可能是一个文本文件,也可能是一个ZIP压缩文件或JPG图片-- Node不知道。

因为阅读文本文件很棘手

即使Node * 知道 * 它要读取一个文本文件,它仍然不知道使用了哪个character encoding(即文件中的字节如何Map到人类可读的字符),因为字符编码本身并没有存储在文件中。
有一些方法可以或多或少地对文本文件的字符编码进行guess(这是文本编辑器在打开文件时所做的),但是通常不希望代码在没有明确指示的情况下依赖于猜测。

缓冲器来救援!

因此,因为它不知道也不可能知道所有这些细节,所以Node只是逐字节地读取文件,而不对文件内容做任何假设。
这就是返回的缓冲区:文件中原始字节的一个无见解的容器。2如何解释这些字节取决于你作为开发者。

wgeznvg7

wgeznvg74#

异步:

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

同步:

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

iih3973s5#

它返回一个Buffer对象。
如果你想把它转换成一个字符串,你可以使用data.toString()

var fs = require("fs");

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

vuktfyat6#

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

vawmfj5a7#

第二个参数中缺少编码方案,通常为"utf-8"。如果未提及编码方案,则返回普通缓冲区。

xu3bshqb

xu3bshqb8#

它只是一个返回内容的函数,需要添加编码参数(如“UTF-8”)进行编码

相关问题