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