流就是一系列的資料——就跟陣列或者字串一樣。有一點不同,就是 stream 可能無法在一次性全部可用,且它們不需要與記憶體完全合槽。這麼一來,stream 在處理大量資料,或者操作乙個一次只給出一部分資料的資料來源的時候顯得格外有用。
其實,流不只是在操作大量資料的時候有用。它還為在**中使用各種強大的組合類功能提供能力。例如,我們在 linux 命令列中可以通過管道(pipe)來完成一些組合性的命令,在 node.js 的流中也能實現。
其中有一些物件甚至是既可讀又可寫的,例如 tcp socket、zlib 以及 crypto 等。
值得注意的是上面說的一些物件也是彼此緊密聯絡的。例如 http 響應在客戶端中是乙個可讀流,而在服務端則是乙個可寫流。畢竟在 http 場景中,我們在客戶端側是從相應物件(http.incommingmessage
)讀取資料,而在服務端則是寫入資料(http.serverresponse
)。
還需要注意的是,stdio
相應的流(stdin
,stdout
,stderr
)在子程序中與主程序都是相反的流型別。這樣一來主程序和子程序直接就可以方便地 pipestdio
資料了。
node.js 中的流有 4 種基本型別:readable(可讀流)、writable(可寫流)、duplex(雙工流)和 transform**換流)。
所有的流都是繼承自eventemitter
。也就是說,它們觸發的事件可以用於讀寫資料。不過,我們也可以簡單粗暴地用pipe
來消費流資料。
// 可讀流const instream = new readable(
}});
instream.currentcharcode = 65;
instream.pipe(process.stdout);
// 可寫流const = require('stream');
const outstream = new writable(
});process.stdin.pipe(outstream);
// 雙工流const = require('stream');
const inoutstream = new duplex(,
read(size)
}});
inoutstream.currentcharcode = 65;
process.stdin.pipe(inoutstream).pipe(process.stdout);
// 轉換流const = require('stream');
const uppercasetr = new transform(
});process.stdin.pipe(uppercasetr).pipe(process.stdout);
流的理解 3
參考 流就是資料資料的抽像類,按照物件導向的思想,它就是多型 下面不討論多型的事了,貼幾張圖 來自 前端團隊的 注 圖中的writeorbuffer 佇列池,實際上就是 corked highwatermark 流的一切東西,完全可以從現實中找到答案。比較貼切的就是蓄水池.蓄水池肯定有大小的吧,流也...
理解文件流
這個暑假裡的實習是真正讓我體會到了做前端一定要理解文件流。之前一直處於必須給元素加邊框才能看到我講元素放置在了文件中的什麼位置。理解了文件流,腦海中就會定位到相應的元素。文件流,其實本沒有這樣的定義,有的是普通流的概念。簡單說就是元素按照其在html中的位置順序決定排布的過程。並且這種過程遵循標準的...
對於I O流的理解
學習c primer第5版的io流感覺很困惑。後來結合書上的講解想了想,談談自己的理解吧。輸入輸出流就表示一連串的輸入輸出資料。可以把這一連串的資料看做是乙個物件,所以可以用乙個物件表示輸入 輸出流。cin cout cerr clog就是4個用於表示普通流的物件。特別地,cin是表示來自鍵盤的輸入...