📅  最后修改于: 2023-12-03 15:17:56.942000             🧑  作者: Mango
在 Node.js 中,我们可以使用可读流来读取数据。可读流是一个抽象类,提供了一些方法来读取数据,比如 read
,pipe
等。同时,可读流也是一个事件发射器,提供了多个事件,其中一个重要的事件就是数据事件。
数据事件会在可读流中有新的数据时触发。我们可以监听数据事件,从而读取数据。数据事件会传递一个数据块(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 可以是字符串,也可以是 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
选项,表示每次读取的最大字节数,以此来触发多次数据事件。
数据事件是可读流中最常用的事件之一,它可以帮助我们读取大文件、网络连接等数据流。我们可以通过暂停可读流等方式来控制读取数据的速度,以保证数据的完整性和可靠性。