微信登录

核心模块 - stream 模块 - 创建与使用可读流

Node.js 《核心模块 - stream 模块 - 创建与使用可读流》

在 Node.js 中,stream 模块是非常重要的一个核心模块,它提供了一种高效处理数据的方式,特别是在处理大量数据时,流的优势更加明显。本文将详细介绍如何创建和使用可读流。

什么是可读流

可读流是 Node.js 中流的一种类型,它表示可以从中读取数据的源。常见的可读流源包括文件、网络连接、HTTP 请求等。可读流以一种连续的方式提供数据,你可以一次读取一部分数据,而不需要将整个数据加载到内存中,这在处理大文件或大量数据时非常有用。

创建可读流

在 Node.js 中,创建可读流通常使用 fs 模块(用于文件操作)或 http 模块(用于网络请求)。下面我们以 fs 模块为例,介绍如何创建一个可读流。

示例代码

  1. const fs = require('fs');
  2. // 创建一个可读流
  3. const readableStream = fs.createReadStream('example.txt', {
  4. encoding: 'utf8', // 设置编码为 UTF-8
  5. highWaterMark: 1024 // 设置缓冲区大小为 1024 字节
  6. });
  7. // 监听 data 事件,当有数据可读时触发
  8. readableStream.on('data', (chunk) => {
  9. console.log('Received data chunk:');
  10. console.log(chunk);
  11. });
  12. // 监听 end 事件,当流读取结束时触发
  13. readableStream.on('end', () => {
  14. console.log('Read operation completed.');
  15. });
  16. // 监听 error 事件,当发生错误时触发
  17. readableStream.on('error', (err) => {
  18. console.error('An error occurred:', err);
  19. });

代码解释

  1. 引入 fs 模块:使用 require('fs') 引入 Node.js 的文件系统模块。
  2. 创建可读流:使用 fs.createReadStream 方法创建一个可读流。该方法接受两个参数:文件路径和一个可选的配置对象。在配置对象中,我们设置了 encoding'utf8',表示以 UTF-8 编码读取文件;highWaterMark1024,表示缓冲区的大小为 1024 字节。
  3. 监听事件
    • data 事件:当有数据可读时触发,回调函数的参数 chunk 表示读取到的数据块。
    • end 事件:当流读取结束时触发。
    • error 事件:当发生错误时触发,回调函数的参数 err 表示错误对象。

可读流的两种模式

可读流有两种模式:流动模式和暂停模式。

流动模式

在流动模式下,数据会自动从底层系统读取,并通过 data 事件尽快提供给应用程序。上面的示例代码就是使用的流动模式。

暂停模式

在暂停模式下,需要手动调用 read() 方法来读取数据。下面是一个使用暂停模式的示例代码:

  1. const fs = require('fs');
  2. const readableStream = fs.createReadStream('example.txt', {
  3. encoding: 'utf8',
  4. highWaterMark: 1024
  5. });
  6. // 设置为暂停模式
  7. readableStream.pause();
  8. // 监听 readable 事件,当有数据可读时触发
  9. readableStream.on('readable', () => {
  10. let chunk;
  11. while ((chunk = readableStream.read()) !== null) {
  12. console.log('Received data chunk:');
  13. console.log(chunk);
  14. }
  15. });
  16. readableStream.on('end', () => {
  17. console.log('Read operation completed.');
  18. });
  19. readableStream.on('error', (err) => {
  20. console.error('An error occurred:', err);
  21. });

代码解释

  1. 设置为暂停模式:使用 readableStream.pause() 方法将可读流设置为暂停模式。
  2. 监听 readable 事件:当有数据可读时触发,在回调函数中使用 readableStream.read() 方法读取数据,直到返回 null 表示没有更多数据。

总结

模式 特点 使用场景
流动模式 数据自动从底层系统读取,并通过 data 事件尽快提供给应用程序 简单的数据处理场景,不需要手动控制数据读取
暂停模式 需要手动调用 read() 方法来读取数据 复杂的数据处理场景,需要手动控制数据读取

通过本文的介绍,你应该已经了解了如何创建和使用可读流,以及可读流的两种模式。在实际开发中,根据具体需求选择合适的模式可以提高代码的效率和性能。