📜  Node.js 可读流数据事件(1)

📅  最后修改于: 2023-12-03 15:17:56.942000             🧑  作者: Mango

Node.js 可读流数据事件

在 Node.js 中,我们可以使用可读流来读取数据。可读流是一个抽象类,提供了一些方法来读取数据,比如 readpipe 等。同时,可读流也是一个事件发射器,提供了多个事件,其中一个重要的事件就是数据事件。

数据事件简介

数据事件会在可读流中有新的数据时触发。我们可以监听数据事件,从而读取数据。数据事件会传递一个数据块(chunk)作为参数。

下面是一个简单的例子,演示了如何监听数据事件,从可读流中读取数据:

const fs = require('fs');

const rs = fs.createReadStream('input.txt');

rs.on('data', (chunk) => {
  console.log(`Received chunk: ${chunk.toString()}`);
});

rs.on('end', () => {
  console.log('Read stream finished.');
});

在这个例子中,我们使用 fs 模块创建了一个可读流,然后监听了它的 data 事件。当数据事件触发时,我们就可以读取数据了。

chunk 的类型

chunk 可以是字符串,也可以是 Buffer 对象。这取决于我们读取数据时指定的编码。

比如,如果我们使用 rs.setEncoding('utf8') 方法设置编码为 utf8,那么读取时返回的数据块的类型就是字符串。如果我们不设置编码(或者编码为 null),那么返回的数据块的类型就是 Buffer 对象。

暂停可读流

我们还可以使用 rs.pause() 方法暂停可读流的读取,使用 rs.resume() 方法恢复读取。暂停可读流之后,数据事件将不再触发,所以在恢复读取之前要小心,以免丢失数据。

下面是一个暂停可读流的例子:

const fs = require('fs');

const rs = fs.createReadStream('input.txt', { highWaterMark: 3 });

rs.on('data', (chunk) => {
  console.log(`Received chunk: ${chunk.toString()}`);
  rs.pause();
  console.log('Paused readable stream for 2 seconds...');
  setTimeout(() => {
    rs.resume();
  }, 2000);
});

rs.on('end', () => {
  console.log('Read stream finished.');
});

在这个例子中,我们在读取每个数据块时暂停了可读流,等待两秒钟后再恢复读取。这个例子还指定了 highWaterMark 选项,表示每次读取的最大字节数,以此来触发多次数据事件。

结论

数据事件是可读流中最常用的事件之一,它可以帮助我们读取大文件、网络连接等数据流。我们可以通过暂停可读流等方式来控制读取数据的速度,以保证数据的完整性和可靠性。