在 Node.js 中,stream
模块是非常重要的一个核心模块,它提供了一种高效处理数据的方式,特别是在处理大量数据时,流的优势更加明显。本文将详细介绍如何创建和使用可读流。
可读流是 Node.js 中流的一种类型,它表示可以从中读取数据的源。常见的可读流源包括文件、网络连接、HTTP 请求等。可读流以一种连续的方式提供数据,你可以一次读取一部分数据,而不需要将整个数据加载到内存中,这在处理大文件或大量数据时非常有用。
在 Node.js 中,创建可读流通常使用 fs
模块(用于文件操作)或 http
模块(用于网络请求)。下面我们以 fs
模块为例,介绍如何创建一个可读流。
const fs = require('fs');
// 创建一个可读流
const readableStream = fs.createReadStream('example.txt', {
encoding: 'utf8', // 设置编码为 UTF-8
highWaterMark: 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() 方法来读取数据 |
复杂的数据处理场景,需要手动控制数据读取 |
通过本文的介绍,你应该已经了解了如何创建和使用可读流,以及可读流的两种模式。在实际开发中,根据具体需求选择合适的模式可以提高代码的效率和性能。