EventEmitter
Stream(流)
-
Readable - 可读流 (fs.createReadStream)
-
Writeable - 可写流(fs.createWriteStream)
-
Duplex - 可读写流(双工流)
-
Transform - 转换流 - 在读写过程中改变和变换数据 Duplex
-
单工 - 数据只允许在一个方向上传输,
-
半双工 - 数据允许在两个方向上传输 , 但是同一时间内 只可以一方发送或接受消息
-
全双工 - 同时可以进行双向传输 - TCP
-
node中使用数据流时触发的事件:每个数据流都有一个EventEmitter实例,该实例
的作用是触发事件。
(1)data —- 当流中有数据可读取时触发。data是事件名 (2)end —- 当流中没有数据时触发。end是事件名
(3)error —- 当有任何错误触发。error是事件名
(4)finish —- 当所有数据已刷新到底层系统时触发。finish是事件名
可读流工作在两种模式下
* flowing (自动流)
* paused (暂停模式) 如果要读取数据 就必须显示的调用 stream.read() 方法
* 所有 paused 流 ,都可以通过下面三种途径,切换到 flowing 模式
* 监听 data 事件
* 调用 stream.resume()
* 调用 stream.pipe(xxx)
*/
const fs = require("fs");
/**
* encoding : 编码
* fd:文件描述符
* autoClose:true
* start: 读取文件的其实位置
* end: 读取文件的结束位置(包含结束位置)
* highWaterMark 最大读取文件的字节数 默认值 64 * 1024;
*/
let rs = fs.createReadStream("big.txt", {
start: 0,
highWaterMark: 3,
});
let array = [];
rs.on("data", (data) => {
array.push(...data);
rs.pause(); //暂停 进入paused
console.log("暂停模式", array.length);
setTimeout(() => {
console.log("恢复了");
rs.resume(); // paused -> flowing
}, 100);
});
rs.on("open", () => {
console.log("文件打开了");
});
rs.on("close", () => {
console.log("文件关闭了");
});
rs.on("error", (err) => {
console.log("触发错误了", rr);
});
rs.on("end", () => {
console.log("读完了");
array = null;
console.log(Buffer.from(array).toString());
});
可写流
* encoding : 编码
* fd:文件描述符
* autoClose:true
* start: 读取文件的其实位置
* end: 读取文件的结束位置(包含结束位置)
* highWaterMark 一个对比写入字节数的标识 16 * 1024
*/
const fs = require("fs");
let ws = fs.createWriteStream("xxx.txt",{
highWaterMark:2
});
let flag1 = ws.write("1")
let flag2 = ws.write("2")
let flag3 = ws.write("3")
ws.write("6")
ws.write("7")
ws.write("8")
//当写入内容大于等于 highWaterMark
ws.on("drain",()=>{
console.log("吸干了")
ws.end();
})
console.log(flag1,flag2,flag3)