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)