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

image.pngimage.pngimage.pngimage.png

  1. const fs = require('fs');
  2. const stream = fs.createWriteStream('./file.txt');
  3. for(let i=0;i<1000000;i++){
  4. stream.write(`这是第${i}行内容,我还要写更多继续写\n`)
  5. }
  6. stream.end();
  7. console.log('done')

stream 流 chunk 块 pipe 管道链接 sink 池 source 源 每次传递的 chunk 都是一个 Buffer // 一个16进制的01数据 Readable 可读 Writable 可写 Duplex 可读可写(双向)
Transform 可读可写(变化) 类似babel -> es6+ > es5 // sass -> css

image.png

  1. const http = require('http')
  2. const fs = require('fs')
  3. const serve = http.createServer()
  4. serve.on('request',(request,response)=>{
  5. fs.readFile('./file.txt',(error,data)=>{
  6. if(error)throw error
  7. response.end(data)
  8. console.log('done')
  9. })
  10. })
  11. serve.listen('8999')
  12. //文件内容一下全部读取 ,占用很高的内存 , 速度快
  1. const http = require('http')
  2. const fs = require('fs')
  3. const serve = http.createServer()
  4. serve.on('request',(request,response)=>{
  5. fs.readFile('./file.txt',(error,data)=>{
  6. if(error)throw error
  7. response.end(data)
  8. console.log('done')
  9. })
  10. })
  11. serve.listen('8999')
  12. //用Stream 的方式 , 数据一块一块的读取 每次读到一定程度就释放内存在重新开始
  13. // 内存占用小 速度偏慢
  1. const http = require('http')
  2. const fs = require('fs')
  3. const serve = http.createServer()
  4. serve.on('request',(request,response)=>{
  5. const stream = fs.createReadStream('./file.txt')
  6. stream.on('data',(chunk)=>{
  7. console.log('停一下')
  8. console.log(chunk)
  9. })
  10. stream.pipe(response) //暂停
  11. stream.pause()
  12. setTimeout(()=>{stream.resume},1000) // 1秒后继续
  13. })
  14. serve.listen('8000')
  15. console.log('done')

// Readable stream

分两种状态 pasused(静止状态) 和 flowing(流动状态)
默认处于 paused 状态下
添加 data 事件监听就变成flowing状态
删掉 data 事件监听就变成paused状态了
pause() 可以变成 paused状态
resume() 可以变成 flowing 状态

  1. const fs = require('fs')
  2. function writeOneMillionTimes(writer, data) {
  3. let i = 10000;
  4. write();
  5. function write() {
  6. let ok = true;
  7. do {
  8. i--;
  9. if (i === 0) {
  10. // Last time!
  11. writer.write(data);
  12. } else {
  13. // See if we should continue, or wait.
  14. // Don't pass the callback, because we're not done yet.
  15. ok = writer.write(data);
  16. if(ok===false){
  17. console.log('别写了')
  18. }
  19. }
  20. } while (i > 0 && ok);
  21. if (i > 0) {
  22. // Had to stop early!
  23. // Write some more once it drains.
  24. writer.once('drain', ()=>{
  25. console.log('lets go')
  26. write()
  27. });
  28. }
  29. }
  30. }
  31. const writer = fs.createWriteStream('./big.txt');
  32. writeOneMillionTimes(writer,'hello')
  33. // https://nodejs.org/api/stream.html#stream_event_drain

drain官方文档

drain 事件 , 写入太快了会堵塞 , 当疏通后 drain事件会继续往下写