[TOC]
## rs
> 低于最高水位線就會自動填充觸發readable事件
- 
> 讀到末尾會觸發readable事件
當到達流數據尾部時, 'readable' 事件也會觸發。觸發順序在 'end' 事件之前。
事實上, 'readable' 事件表明流有了新的動態:要么是有了新的數據,要么是到了流的尾部。 對于前者, stream.read() 將返回可用的數據。而對于后者, stream.read() 將返回 null。
- 
## 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
});
```