const fs = require('fs')
const s = fs.createReadStream('./file.txt')
console.log(s)
Terminal run//
node --inspect-brk main.js
在打开浏览器开发者模式 -> 打开node调试模式
ReadStream.__proto__ = Readable.prototype
Readable.__proto__ = Stream.prototype
Stream.__protp__ = EventEmitter.prototype
EventEmitter.__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 error
response.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 error
response.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事件会继续往下写