Categories
nodejs

nodejs Stream

nodejs 流对象操作 记录

自定义可写流

const {Writable} = require('stream')

class CounterStream extends Writable {
    


    constructor(options){
        super(options)
        this.counter = 0
    }

    _write(chunk , encoding, callback){
        console.log(chunk.toString("utf-8"))
        this.counter+=chunk.length
        callback.call()
    }

    
}


module.exports = CounterStream

关键在于继承stream.Writeable 并且重写 _write(chunk , encoding, callback)

自定义可读流

const {Readable} = require('stream')

class MyReadableStream extends Readable {
    


    constructor(options){
        super(options)
        this.isFinished = false
    
    }

    _read(size){
        //待处理数据放在this._buffer中
        if(!this.isFinished){
            this.push("abc123")
            this.isFinished = true
        }else{
            this.push(null)
        }
    }
}


module.exports = MyReadableStream

关键在于继承stream.Readable 并且重写 _read(size)

_read 方法中要把数据放到this.push的方法中 且 没有数据读取时 this.push(null) 结束读取

可以从Readable.pipe(Writable) 使用管道的方式 从可读流读取数据 pipe 到可写流中

注意 该方法为异步方法

特殊的流 socket 为双向流 可读可写

process.stdin 标准输入流

process.stdout 标准输出流

process.stderr 标准异常流

把标准输入流输出到标准输出流

const stdin = require('process').stdin
const stdout = require('process').stdout
const stderr = require('process').stderr

stdin.pipe(stdout)

执行后 主线程阻塞 读取标准输入流 读取到数据后 在 标准输出流输出

输入流事件有以下几个

输出流事件