摘要:是在完成處理數據塊后需要調用的函數。這是寫數據成功與否的標志。若要發出故障信號,請用錯誤對象調用回調函數。雙工流的可讀性和可寫性操作完全獨立于彼此。這僅僅是將兩個特性組合成一個對象。
Streams 是一個數據集——和數組、字符串一樣。不同的是streams的數據可能不能馬上全部獲取到,他們不需要在內存中。這樣使得streams在處理大數據集或者來自外部的數據源的數據塊上能發揮很大的作用。
Streams在Node.js中非常重要的一個模塊,其數據主要分為二進制和對象模式,應用廣泛。一個流是一個具備了可讀、可寫或既可讀又可寫能力的接口,通過這些接口,我們可以和、HTTP請求來交互,實現數據從一個地方流動到另一個地方的功能。
二進制模式的每個對塊為buffer/stringStream(流)的類型:
對象模式.流內部處理的是一系列普通的對象
Stream.Readable -可讀的流
Stream.Writable -可寫的流
Stream.Duplex -可讀寫的流
Stream.Transform -在讀寫過程中可以修改和變換數據的Duplex (zlib, createDeflate())
Stream.Readable主要用來提供數據,外部來源的數據均會儲存到內部的buffer數組緩存起來.主要是以下兩種模式:
flowing.自動從系統底層讀取數據,并通EventEmitter接口事件盡快將數據提供給應用.
可通過以下兩種途徑切換到paused模式:
不存在管道目標.直接使用stream.paused
存在管道目標,直接取消data事件監聽,并調用stream.unpipe()移除管道.
let fs = require("fs");//456789 let rs = fs.createReadStream("./13.stream/2.txt",{ start:3, end:8, highWaterMark:3 }); rs.on("data",function(data){ console.log(data.toString()); }); rs.on("end",function(){ console.log("over"); }); rs.on("error",function(err){ console.log(err); }); rs.on("open",function(){ console.log("open"); }); rs.on("close",function(){ console.log("close"); });
paused.需要手動使用stream.read()方法從流中讀取數據片段.可以直接指定讀取數據的長度.
可通過以下三種途徑切換到flowing模式:
可通過監聽"data"事件,
調用stream.resume(),
調用stream.pipe()方法將數據發送到writable
let {Readable} = require("stream"); let util = require("util"); util.inherits(Counter,Readable); function Counter(){ Readable.call(this); this.index = 3; } Counter.prototype._read = function(){ if(this.index-->0){ this.push(this.index+""); }else{ this.push(null); } } let counter = new Counter(); counter.on("data",function(data){ console.log(data.toString()) });
可讀流默認情況下都是在暫停模式Stream.Writable
消費數據的stream.從readble stream中獲取數據.然后對得到的chunk快進行處理.
const { Writable } = require("stream"); const outStream = new Writable({ write(chunk, encoding, callback) { console.log(chunk.toString()); callback(); } }); process.stdin.pipe(outStream); // chunk通常是一個buffer,除非我們配置不同的流。 // encoding是在特定情況下需要的參數(utf8),通常我們可以忽略它。 // callback是在完成處理數據塊后需要調用的函數。這是寫數據成功與否的標志。若要發出故障信號,請用錯誤對象調用回調函數。Stream.Duplex
在同一個對象上同時實現可讀和可寫,并且可讀性和可寫性操作完全獨立于彼此,僅僅是將兩個特性組合成一個對象。
const { Duplex } = require("stream"); const inoutStream = new Duplex({ write(chunk, encoding, callback) { console.log(chunk.toString()); callback(); }, read(size) { this.push(String.fromCharCode(this.currentCharCode++)); if (this.currentCharCode > 90) { this.push(null); } } }); inoutStream.currentCharCode = 65; process.stdin.pipe(inoutStream).pipe(process.stdout);
雙工流的可讀性和可寫性操作完全獨立于彼此。這僅僅是將兩個特性組合成一個對象。Stream.Transform
轉換流可以理解為時一個更加有趣的雙工流,我們只需要實現一個transfrom方法,將兩者結合起來.
const { Transform } = require("stream"); const upperCaseTr = new Transform({ transform(chunk, encoding, callback) { this.push(chunk.toString().toUpperCase()); callback(); } }); process.stdin.pipe(upperCaseTr).pipe(process.stdout)
關于stream的相關api及源碼解析,將會在年后,陸續補充
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/107202.html
摘要:一旦替換已經完成,該模塊將被完全棄用。用作錯誤處理事件文件,由在標準功能上的簡單包裝器提供所有模塊都提供這些對象。 Node.js簡介 Node 定義 Node.js是一個建立在Chrome v8 引擎上的javascript運行時環境 Node 特點 異步事件驅動 showImg(https://segmentfault.com/img/bVMLD1?w=600&h=237); no...
摘要:在創建時大小已經被確定且是無法調整的,在內存分配這塊是由層面提供而不是具體后面會講解。在這里不知道你是否認為這是很簡單的但是上面提到的一些關鍵詞二進制流緩沖區,這些又都是什么呢下面嘗試做一些簡單的介紹。 showImg(https://segmentfault.com/img/remote/1460000019894717?w=1280&h=850); 多數人都擁有自己不了解的能力和機...
摘要:而造成一些莫名其妙的錯誤。寫一個文件打印出編譯命令會在同級目錄下生成一個同名的文件。將包裹在了一個匿名函數當中,并用調用,這樣使得代碼隔離,不會和外部混淆。其中的表示的就是為了方便使用,可以使用雙冒號來替代。 很早就知道這CoffeeScript一門語言,但是一直沒有機會系統的學習下,那天趁在公司沒有什么要緊的項目做,就根據CoffeeScript首頁的例子學了一下。 引用Coffe...
摘要:開公眾號差不多兩年了,有不少原創教程,當原創越來越多時,大家搜索起來就很不方便,因此做了一個索引幫助大家快速找到需要的文章系列處理登錄請求前后端分離一使用完美處理權限問題前后端分離二使用完美處理權限問題前后端分離三中密碼加鹽與中異常統一處理 開公眾號差不多兩年了,有不少原創教程,當原創越來越多時,大家搜索起來就很不方便,因此做了一個索引幫助大家快速找到需要的文章! Spring Boo...
閱讀 1682·2021-11-17 09:33
閱讀 3546·2021-11-16 11:40
閱讀 3065·2019-08-30 11:23
閱讀 1058·2019-08-29 16:36
閱讀 2475·2019-08-29 13:23
閱讀 1750·2019-08-29 12:59
閱讀 1554·2019-08-29 12:42
閱讀 1990·2019-08-28 18:22