简介
在 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 还有包括 readable
、writable
、paused
、destroyed
等在内的其他属性,读者可以查看 Node.js 文档获取更多信息。
事件
stream 对象的行为除了由属性外,还可以通过事件来控制。stream 对象可以发出以下事件:
readable
:当 stream 有数据可供消费时,会触发该事件。该事件表示数据可以开始读取了。data
:每次从 stream 中读取到一块数据时,该事件就会触发,回调函数的参数通常是读取到的数据块。end
:当 stream 中数据读完时触发该事件,表示读取完成。error
:当 stream 发生错误时,会触发该事件。回调函数的参数通常是一个 Error 对象。close
:当 stream 被关闭时,会触发该事件。
除了上述事件,stream 还有包括 drain
、finish
、pipe
等在内的其他事件,读者可以查看 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
函数结束数据写入。
下面是一个写入文件的示例代码:
const fs = require('fs'); const writableStream = fs.createWriteStream('output.txt'); writableStream.write('hello'); writableStream.write(' '); writableStream.write('world'); writableStream.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