[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
});
```