node.js中stream流中可读流和可写流的实现与使用方法实例分析

2020-06-17 08:00:35易采站长站整理

});
//当文件被关闭时触发
rs.on('close', function () {
console.log('文件关闭');
});

注意,’open’ 和 ‘close’ 事件并不是所有流都会触发。

当们监听’data’事件后,系统会尽可能快的读取出数据。但有时候,我们需要暂停一下流的读取,操作其他事情。

这时候就需要用到 pause() 和 resume() 方法。


const fs = require('fs');
//创建一个文件可读流
let rs = fs.createReadStream('./1.txt', {
highWaterMark: 3
});
rs.on('data', function (data) {
console.log(`读取了 ${data.length} 字节数据 : ${data.toString()}`);
//使流动模式的流停止触发'data'事件,切换出流动模式,数据都会保留在内部缓存中。
rs.pause();
//等待3秒后,再恢复触发'data'事件,将流切换回流动模式。
setTimeout(function () {
rs.resume();
}, 3000);
});

可读流的 ‘readable’ 事件,当流中有数据可供读取时就触发。

注意当监听 ‘readable’ 事件后,会导致流停止流动,需调用 read() 方法读取数据。

注意 on(‘data’),on(‘readable’),pipe() 不要混合使用,会导致不明确的行为。


const fs = require('fs');
let rs = fs.createReadStream('./1.txt', {
highWaterMark: 1
});
//当流中有数据可供读取时就触发
rs.on('readable', function () {
let data;
//循环读取数据
//参数表示要读取的字节数
//如果可读的数据不足字节数,则返回缓冲区剩余数据
//如是没有指定字节数,则返回缓冲区中所有数据
while (data = rs.read()) {
console.log(`读取到 ${data.length} 字节数据`);
console.log(data.toString());
}
});

五、创建可写流,并监听事件


const fs = require('fs');
//创建一个文件可写流
let ws = fs.createWriteStream('./1.txt', {
highWaterMark: 3
});
//往流中写入数据
//参数一表示要写入的数据
//参数二表示编码方式
//参数三表示写入成功的回调
//缓冲区满时返回false,未满时返回true。
//由于上面我们设置的缓冲区大小为 3字节,所以到写入第3个时,就返回了false。
console.log(ws.write('1', 'utf8'));
console.log(ws.write('2', 'utf8'));
console.log(ws.write('3', 'utf8'));
console.log(ws.write('4', 'utf8'));
function writeData() {
let cnt = 9;
return function () {
let flag = true;
while (cnt && flag) {
flag = ws.write(`${cnt}`);
console.log('缓冲区中写入的字节数', ws.writableLength);