Node 基础模块 - Stream (流)
Stream (流)是一个抽象的概念,在我们开发中会经常使用到(例如:fs 模块文件的读取和写入、http 请求的发送和相应 以及
控制台上面打印日志)。
首页 Stream (流) 这个模块继承 EventEmitter 模块,所以这里可以使用 EventEmitter 的事件事件订阅发布模式。
个人理解,流类就是封装了一套对输入输出的数据的缓存 (利用 Buffer ,分配一定内存,分批读取或者写入) 并且进行操作。
分类
按照 Stream (流) 的用途可分为 :可写流 ( stream.Wiritable )、可读流( stream.Readable )、双工流 (stream.Duplex)、转换流 (stream.Transform)。
我们只介绍下可写和可读流。
可写流 (stream.Writable) 常见的有:
fs 模块的可写流
http 的响应
客户端的请求
子进程的 stdin
它们都是实现了 stream.Writable 类的接口
可读流 ( stream.Readable ) 常见的有:
fs 的可读流
http 的请求
客户端的响应
他们都实现了 stream.Readbale 类的接口
可写流 ( stream.Writeable )
主要事件句柄:
close 、error、finish :基础句柄
drain:当分配的内存满了 ( writer.write 返回 false ) 的时候,内存释放后再次可以使用的时候触发
pipe:当可读流调用管道输入数据的时候( reader.pipe )。调用并返回可读流
主要方法:
write:写入数据
end:结束写入流。
setDefaultEncoding:设置编码
/*
* 创建一个可写流
* fs 的写入流继承 stream.Writeable 类
* */
const writer = fs.createWriteStream('./2.txt');
/*
* 缓冲区满了,释放后重新可以写入事件
* */
writer.on('drain', () => {
console.log('重新可以写入事件');
})
/*
* 结束事件
* */
writer.on('finish', () => {
console.log('所有写入完成');
})
/*
* 发生错误事件
* */
writer.on('error', () => {
console.log('所有写入完成');
})
/*
* 管道写入事件
* 当可读流调用了 pipe(writer) 时候触发事件,并传入 可读流对象
* 当可读流调用了 unpipe(writer) 时候触发事件,并传入 可读流对象
* */
writer.on('pipe', () => {
console.log('所有写入完成');
})
writer.on('unpipe', () => {
console.log('所有写入完成');
})
/*
* 设置编码
* */
writer.setDefaultEncoding('utf8')
/*
* 写入数据到流
* */
writer.write(',test','utf8',()=>{})
/*
* 写入完毕,写入目的文件
* */
writer.end('end!')
可读流 ( stream.Readable )
可读流分为两种模式:暂停模式和流动模式
流动模式可以自动的读取数据到目标。切换到流动模式可以通过:data 事件句柄触发、调用 resume 方法、可以通过管道传输
暂停模式就是需要手动读取,需要调用 read。切换到暂停模式可以通过:调用 pause 方法、移除管道输入目标
常见的事件句柄:
data :用于接受数据,触发流动模式
end/error:结束/错误
常见的方法:
read:暂停模式读取数据
pipe:以管道形式向目标传输数据
se'tEncodding: 设置编码
const writer = fs.createReadStream('./2.txt');
writer.setEncoding('utf8')
writer.on('data',(res)=>{
console.log(res)
})
readline // 逐行读取数据