多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] ## rs > 低于最高水位线就会自动填充触发readable事件 - ![](https://box.kancloud.cn/720174ec6b70b2dd8e378f919b41569b_709x478.png) > 读到末尾会触发readable事件 当到达流数据尾部时, 'readable' 事件也会触发。触发顺序在 'end' 事件之前。 事实上, 'readable' 事件表明流有了新的动态:要么是有了新的数据,要么是到了流的尾部。 对于前者, stream.read() 将返回可用的数据。而对于后者, stream.read() 将返回 null。 - ![](https://box.kancloud.cn/7eca3a0db687c3210c23220594ddf2a2_326x253.png) ## ws > 当一个流不处在 drain 的状态, 对 write() 的调用会缓存数据块, 并且返回 false。 一旦所有当前所有缓存的数据块都排空了(被操作系统接受来进行输出), 那么 'drain' 事件就会被触发 建议, 一旦 write() 返回 false, 在 'drain' 事件触发前, 不能写入任何数据块 ### end方法 ws.end(chunk,[encoding],[callback]); > 表明接下来没有数据要被写入 Writable 通过传入可选的 chunk 和 encoding 参数,可以在关闭流之前再写入一段数据 如果传入了可选的 callback 函数,它将作为 'finish' 事件的回调函数 ### finish事件 ``` var writer = fs.createWriteStream('./2.txt'); for (let i = 0; i < 100; i++) { writer.write(`hello, ${i}!\n`); } writer.end('结束\n'); writer.on('finish', () => { console.error('所有的写入已经完成!'); }); ``` ## pipe pipe时 write必须要有回调来消费 不然缓冲区不会-- ,读出来的也就不会放到wirte的缓冲区里 pipe时,如果不消费,ws不会触发`drain`的回调,既不会`resume`,`flowing`状态不会改变和调用`read`,也就不会触发 `data` 回调往 **ws**中写 ## readable ``` let fs = require('fs'); let rs = fs.createReadStream('./1.txt',{ start:0, highWaterMark:3 }); //在真实的情况下,当可读流创建后会立刻进行暂停模式。其实会立刻填充缓存区 rs.on('readable',()=>{ console.log(rs._readableState.length); //3 //当年消费掉一个字节之后,缓存区变成2个字节了 let char = rs.read(1); console.log(char); console.log(rs._readableState.length); //2 //但当你一旦发现缓冲区的字节数小于最高水位线了,则会再读最高水位线个字节到缓冲区里 setTimeout(()=>{ console.log(rs._readableState.length); },50) }); ``` ## options参数注意事项 ``` let ws = new WriteStream('./2.txt',{ //如果 options 是一个字符串,则它指定了字符编码。 flags:'w' ,highWaterMark:3 ,encoding:'utf8' ,fd:null //果指定了 fd,则 WriteStream 会忽略 path 参数并且会使用指定的文件描述符。 这意味着不会触发 'open' 事件 ,mode:0o666 ,autoClose:true //如果 autoClose 被设置为 true(默认),则在 error 或 end 时,文件描述符会被自动关闭。 如果 autoClose 为 false,则文件描述符不会被关闭,即使有错误。 应用程序需要负责关闭它,并且确保没有文件描述符泄漏。 ,start:0 }); ```