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 // 逐行读取数据