Stream

568 阅读1分钟

Stream 流

stream是水流,但默认没有水
stream.write可以让水流中有水
每次写入的小数据叫做chunk(块)
产生数据的一段叫做source(源头)
得到数据的一段叫做sink(水流)

const fs = require('fs')
const stream = fs.createWriteStream('./big_file.text')//创建一个写入流

for (let i = 0; i < 1000000; i++) {
	//向流中写入数据
    stream.write(`这是第${i}行数据,我们需要很多很多内容,要不停地写文件啊啊啊啊啊啊回车\n`)
}
stream.end()
console.log('done')

pipe 管道

两个流可以通过管道一个管道(pipe)相连
只要stream1有数据,就会流到stream2

const fs = require('fs')
const http = require('http')
const server = http.createServer()
server.on('request', (req, res) => {
    const stream = fs.createReadStream('./big_file.text')
    stream.pipe(res)
    stream.on('end', () => {
        console.log('done')
    })
})

server.listen(8888)
console.log('run')

//支持链式操作 如:a.pipe(b).pipe(c)

stream对象的原型、事件

//借助node --inspect-brk fileName.js 可以打印出stream对象,方便我们查看

支持事件与方法 stream的分类

Readable stream

Readable 有paused(静止)/flowing(流动)两种状态,默认处于paused状态,添加data事件监听就会变成flowing状态,删除data事件监听,就变成paused状态,pause()可以将它你变成paused,resume()可以将它变成flowing

writable stream

drain 枯竭(水流干了)
我们调用stream.write(chunk)的时候,可能会的到false
false的意思是你写的太快了,数据积压了,这个时候我们就不能再write了,要监听drain在进行写入

创建自己的stream

//读
const { Readable } = require('stream')

const inStream = new Readable()

inStream.push('ABCDEFG')
inStream.push('NOPIROQEWJROQW')
inStream.push(null)
inStream.pipe(process.stdout)
// inStream.on('data', (chunk) => {这种写法等价上面的写法
//     process.stdout.write(chunk)
// })
//写
const { Writable } = require('stream')

const outStream = new Writable({
    write(chunk, encoding, callback) {
        console.log(chunk.toString())
        callback()
    }
})

process.stdin.pipe(outStream)
// process.stdin.on('data', (chunk) => {
//     outStream.write(chunk)
// })这种写法等价上面的写法

//可读可写转换流
const { Transform } = require('stream')

const upperCaseTr = new Transform({
    transform(chunk, encoding, callback) {
        this.push(chunk.toString().toUpperCase())
        callback()

    }
})
process.stdin.pipe(upperCaseTr).pipe(process.stdout)