【问题标题】:Why does Node.js' fs.readFile() return a buffer instead of string?为什么 Node.js \' fs.readFile() 返回一个缓冲区而不是字符串?
【发布时间】:2022-11-28 07:42:19
【问题描述】:

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


    【解决方案1】:

    来自the docs:

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

    这或许可以解释 &lt;Buffer ...&gt;。指定一个有效的编码,例如 utf-8,作为文件名后的第二个参数。如,

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

    【讨论】:

      【解决方案2】:

      尝试:

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

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

      【讨论】:

        【解决方案3】:

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

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

        因为文件并不总是文本

        即使正如程序员所知:Node 不知道您要读取的文件中有什么。它可以是文本文件,但也可以是 ZIP 存档或 JPG 图像——Node 不知道。

        因为阅读文本文件很棘手

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

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

        缓冲器来拯救!

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

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

        【讨论】:

        • @Loilo Do readFilereadFileSync读取文件的所有字节或只读取字节表示文件的内容
        【解决方案4】:

        异步:

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

        同步:

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

        【讨论】:

          【解决方案5】:

          它返回一个 Buffer 对象。

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

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

          【讨论】:

          • 有点老了,但应该知道这个解决方案引入了额外的开销,因为 buffer.toString() 无论如何都采用 utf-8 编码。因此,这相当于(虽然慢于)@hvgotcodes 的回答。
          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              【解决方案8】:

              如果它不是媒体文件,那么您可以使用 .toString() 方法。

              【讨论】:

                猜你喜欢
                • 2011-09-21
                • 2014-12-03
                • 2017-04-01
                • 2021-12-30
                • 1970-01-01
                • 1970-01-01
                • 2018-07-26
                • 2020-04-08
                • 2017-09-19
                相关资源
                最近更新 更多