Node.js 中的 stream 对象的理解及用法详解

阅读时长 5 分钟读完

简介

在 Node.js 中,stream 是一种处理流数据的 API。它允许我们从文件、网络等来源读取数据,或者将数据写入到文件、网络等位置。stream 是 Node.js 异常常用的模块之一,应用场景也非常广泛,例如处理大型文件、实现 HTTP 流传输等。

本文将详细讲解 Node.js 中 stream 对象的理解及用法,并通过示例代码帮助读者将所学知识实践应用。

理解

对 stream 的理解,可以从两方面入手:stream 对象的属性和 stream 对象的事件。

属性

每个 stream 对象在创建时都有一组属性,这些属性可以控制 stream 对象的行为。最常用的属性有以下三种:

  • highWaterMark:控制每次从 stream 中读入多少字节的数据,默认值为 64 KB。修改它的值可以增加或减少每个读入的块的大小。
  • encoding:用于流排除数据的编码方式,默认为 null。如果设置了 encoding 属性,则 stream 将会自动将读取的数据转换成指定的编码方式。常见的编码方式有 'utf8'、'utf16le'、'ascii'、'base64'、'binary' 等。
  • objectMode:控制 stream 传输的数据是否是普通的字节块。如果设置为 true,则可以像操作数组一样操作 stream。

除了上述三种属性,stream 还有包括 readablewritablepauseddestroyed 等在内的其他属性,读者可以查看 Node.js 文档获取更多信息。

事件

stream 对象的行为除了由属性外,还可以通过事件来控制。stream 对象可以发出以下事件:

  • readable:当 stream 有数据可供消费时,会触发该事件。该事件表示数据可以开始读取了。
  • data:每次从 stream 中读取到一块数据时,该事件就会触发,回调函数的参数通常是读取到的数据块。
  • end:当 stream 中数据读完时触发该事件,表示读取完成。
  • error:当 stream 发生错误时,会触发该事件。回调函数的参数通常是一个 Error 对象。
  • close:当 stream 被关闭时,会触发该事件。

除了上述事件,stream 还有包括 drainfinishpipe 等在内的其他事件,读者可以查看 Node.js 文档获取更多信息。

用法

stream 的用法可以分为读取和写入两种。

读取

读取 stream 可以通过 createReadStream 函数来实现。该函数第一个参数是文件路径,第二个参数是一个可选的 options 对象,可以设置一些读取 stream 的属性。读取 stream 可以通过 on 函数绑定上述事件来控制其读取行为。

下面是一个读取文件的示例代码:

-- -------------------- ---- -------
----- -- - --------------

----- -------------- - ---------------------------------- - -------------- --- --------- ------ ---
----------------------------- -- -- -
  --- ------
  ----- ------- - ---------------------- -- ----- -
    ------------------- -- --------
  -
---

------------------------ -- -- -
  -------------------------
---

fs.createReadStream 创建了一个读取 example.txt 文件的 stream 对象,highWaterMark 属性设置为 24,即读取数据块的大小为 24 字节。同时,设置 encoding 为 'utf8' 表示读取内容应该为 utf8 编码。绑定 readable 事件,当 stream 有数据可供读取时,进入循环,不断地读取数据块并输出它们,直到所有数据块都读取完毕。

写入

写入 stream 可以通过 createWriteStream 函数来实现。该函数第一个参数是文件路径,第二个参数是一个可选的 options 对象,可以设置一些写入 stream 的属性。写入 stream 可以通过 write 函数写入数据,通过 end 函数结束数据写入。

下面是一个写入文件的示例代码:

fs.createWriteStream 创建了一个写入 output.txt 文件的 stream 对象。通过调用 write 函数写入数据,将字符串 'hello'、' '、'world' 分别写入文件中。最后通过调用 end 函数结束数据的写入,并写入字符串 '!'。

总结

stream 是 Node.js 中非常重要的模块之一,可以用于处理大型文件、实现 HTTP 流传输等应用场景。掌握 stream 对象的属性和事件以及读写 stream 的方法是开发高效、健壮 Node.js 应用的基础。本文对 stream 对象的理解及用法进行了详细的讲解,并提供了相应的示例代码,希望读者能够通过实践运用所学知识。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6480719648841e9894fe5c54

纠错
反馈