const fs = require('fs')const s = fs.createReadStream('./file.txt')console.log(s)Terminal run//node --inspect-brk main.js在打开浏览器开发者模式 -> 打开node调试模式ReadStream.__proto__ = Readable.prototypeReadable.__proto__ = Stream.prototypeStream.__protp__ = EventEmitter.prototypeEventEmitter.__proto__ = Object.prototype每一层原型都继承上一个构造函数




const fs = require('fs');const stream = fs.createWriteStream('./file.txt');for(let i=0;i<1000000;i++){stream.write(`这是第${i}行内容,我还要写更多继续写\n`)}stream.end();console.log('done')
stream 流 chunk 块 pipe 管道链接 sink 池 source 源 每次传递的 chunk 都是一个 Buffer // 一个16进制的01数据 Readable 可读 Writable 可写 Duplex 可读可写(双向)
Transform 可读可写(变化) 类似babel -> es6+ > es5 // sass -> css
const http = require('http')const fs = require('fs')const serve = http.createServer()serve.on('request',(request,response)=>{fs.readFile('./file.txt',(error,data)=>{if(error)throw errorresponse.end(data)console.log('done')})})serve.listen('8999')//文件内容一下全部读取 ,占用很高的内存 , 速度快
const http = require('http')const fs = require('fs')const serve = http.createServer()serve.on('request',(request,response)=>{fs.readFile('./file.txt',(error,data)=>{if(error)throw errorresponse.end(data)console.log('done')})})serve.listen('8999')//用Stream 的方式 , 数据一块一块的读取 每次读到一定程度就释放内存在重新开始// 内存占用小 速度偏慢
const http = require('http')const fs = require('fs')const serve = http.createServer()serve.on('request',(request,response)=>{const stream = fs.createReadStream('./file.txt')stream.on('data',(chunk)=>{console.log('停一下')console.log(chunk)})stream.pipe(response) //暂停stream.pause()setTimeout(()=>{stream.resume},1000) // 1秒后继续})serve.listen('8000')console.log('done')
// Readable stream
分两种状态 pasused(静止状态) 和 flowing(流动状态)
默认处于 paused 状态下
添加 data 事件监听就变成flowing状态
删掉 data 事件监听就变成paused状态了
pause() 可以变成 paused状态
resume() 可以变成 flowing 状态
const fs = require('fs')function writeOneMillionTimes(writer, data) {let i = 10000;write();function write() {let ok = true;do {i--;if (i === 0) {// Last time!writer.write(data);} else {// See if we should continue, or wait.// Don't pass the callback, because we're not done yet.ok = writer.write(data);if(ok===false){console.log('别写了')}}} while (i > 0 && ok);if (i > 0) {// Had to stop early!// Write some more once it drains.writer.once('drain', ()=>{console.log('lets go')write()});}}}const writer = fs.createWriteStream('./big.txt');writeOneMillionTimes(writer,'hello')// https://nodejs.org/api/stream.html#stream_event_drain
drain 事件 , 写入太快了会堵塞 , 当疏通后 drain事件会继续往下写

