您好,登錄后才能下訂單哦!
Node.js中stream如何使用,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
使用流的好處
舉一個讀取文件的例子:
使用fs.readFileSync
同步讀取一個文件,程序會被阻塞,所有的數據都會被讀取到內存中.
換用fs.readFile
讀取文件,程序不會被阻塞,但是所有的數據依舊會被一次性全部被讀取到內存中.
當處理大文件壓縮,歸檔,媒體文件和巨大的日志文件的時候,內存使用就成了問題,在這種情況下,流的優勢就體現出來了.
流被設計為異步的方式.相比將剩余的文件數據一次性讀進內存,還是值得讀取一個緩沖區,期望的操作將會被執行,而且結果會被寫到輸出流.
流的分類
stream.Readable
---用于在I/O上獲取數據
stream.Writable
---用于在輸出的目標寫入數據
stream.Duplex
---一個可讀可寫的流,例如網絡連接
stream.Transform
---一個會以某種方式修改數據的雙工流
創建一個可讀流
方法一
var Stream = require('stream') var readable = Stream.Readable(); var source = ['a', 'b', 'c']; readable._read = function() { this.push(source.shift() || null); } readable.pipe(process.stdin);
方法二
var Readable = require('stream').Readable; function MyStream(options) { Readable.call(this, options); } MyStream.prototype = Object.create(Readable.prototype, { constructor: { value: MyStream } }); MyStream.prototype._read = function() { this.push("hello"); this.push(null); } var streams = new MyStream(); streams.pipe(process.stdin);
方法三
var stream = require('stream'); var util = require('util'); function MyStream(options) { stream.Readable.call(this, options); } MyStream.prototype._read = function(size) { this.push('hello'); this.push(null); } util.inherits(MyStream, stream.Readable); var streams = new MyStream(); streams.pipe(process.stdout);
可讀流的一些概念
可讀流是 對提供數據的源頭的抽象
可讀流的實例
http responses,on the client
http requests, on the server
fs read stream
zlib streams
crypto streams
TCP sockets
child process stdout and stderr
process.stdin
可讀流的模式
可讀流有兩種工作模式:flowing和paused.
在flowing模式下,可讀流自動從系統底層讀取數據,并通過EventEmitter接口的事件盡快將數據提供給應用.
可讀流在創建的時候都是處在paused模式.
可讀流可以在兩種模式下切換.
處于paused模式可讀流,可以通過下面三種途徑切換到flowing模式:
監聽'data'事件.
調用stream.resume()
方法.
調用stream.pipe()
方法將數據發送到Writable
處于flowing模式可讀流,可以通過下面兩種途徑切換到paused模式:
如果不存在管道目標,可以通過調用stream.pause()
方法實現
如果存在管道目標,可以通過取消'data'事件監聽,并調用stream.unpipe()
方法移除所有管道來實現
可讀流事件
可讀流提供了以下事件:
'close'事件,事件將在流或底層資源關閉后觸發,但不是所有的流都會觸發該事件.
'data'事件,data事件將會在流將數據傳遞給消費者時觸發.當流轉換到flowing模式時會觸發該事件.
'end'事件,end事件只有在數據被完全消費后才會觸發.
'error'事件,error事件會在底層系統內部出錯從而不能產生數據,或當流的實現試圖傳遞錯誤數據時發生.
'readble'事件,readable事件將在流中有數據可供讀取時觸發.
關于Node.js中stream如何使用問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。