
在 Node.js 中,stream 模块是非常重要的一个核心模块,它提供了一种高效处理数据的方式,特别是在处理大量数据时,流的优势更加明显。本文将详细介绍如何创建和使用可读流。
可读流是 Node.js 中流的一种类型,它表示可以从中读取数据的源。常见的可读流源包括文件、网络连接、HTTP 请求等。可读流以一种连续的方式提供数据,你可以一次读取一部分数据,而不需要将整个数据加载到内存中,这在处理大文件或大量数据时非常有用。
在 Node.js 中,创建可读流通常使用 fs 模块(用于文件操作)或 http 模块(用于网络请求)。下面我们以 fs 模块为例,介绍如何创建一个可读流。
const fs = require('fs');// 创建一个可读流const readableStream = fs.createReadStream('example.txt', {encoding: 'utf8', // 设置编码为 UTF-8highWaterMark: 1024 // 设置缓冲区大小为 1024 字节});// 监听 data 事件,当有数据可读时触发readableStream.on('data', (chunk) => {console.log('Received data chunk:');console.log(chunk);});// 监听 end 事件,当流读取结束时触发readableStream.on('end', () => {console.log('Read operation completed.');});// 监听 error 事件,当发生错误时触发readableStream.on('error', (err) => {console.error('An error occurred:', err);});
fs 模块:使用 require('fs') 引入 Node.js 的文件系统模块。fs.createReadStream 方法创建一个可读流。该方法接受两个参数:文件路径和一个可选的配置对象。在配置对象中,我们设置了 encoding 为 'utf8',表示以 UTF-8 编码读取文件;highWaterMark 为 1024,表示缓冲区的大小为 1024 字节。data 事件:当有数据可读时触发,回调函数的参数 chunk 表示读取到的数据块。end 事件:当流读取结束时触发。error 事件:当发生错误时触发,回调函数的参数 err 表示错误对象。可读流有两种模式:流动模式和暂停模式。
在流动模式下,数据会自动从底层系统读取,并通过 data 事件尽快提供给应用程序。上面的示例代码就是使用的流动模式。
在暂停模式下,需要手动调用 read() 方法来读取数据。下面是一个使用暂停模式的示例代码:
const fs = require('fs');const readableStream = fs.createReadStream('example.txt', {encoding: 'utf8',highWaterMark: 1024});// 设置为暂停模式readableStream.pause();// 监听 readable 事件,当有数据可读时触发readableStream.on('readable', () => {let chunk;while ((chunk = readableStream.read()) !== null) {console.log('Received data chunk:');console.log(chunk);}});readableStream.on('end', () => {console.log('Read operation completed.');});readableStream.on('error', (err) => {console.error('An error occurred:', err);});
readableStream.pause() 方法将可读流设置为暂停模式。readable 事件:当有数据可读时触发,在回调函数中使用 readableStream.read() 方法读取数据,直到返回 null 表示没有更多数据。| 模式 | 特点 | 使用场景 |
|---|---|---|
| 流动模式 | 数据自动从底层系统读取,并通过 data 事件尽快提供给应用程序 |
简单的数据处理场景,不需要手动控制数据读取 |
| 暂停模式 | 需要手动调用 read() 方法来读取数据 |
复杂的数据处理场景,需要手动控制数据读取 |
通过本文的介绍,你应该已经了解了如何创建和使用可读流,以及可读流的两种模式。在实际开发中,根据具体需求选择合适的模式可以提高代码的效率和性能。