摘要:是在完成处理数据块后需要调用的函数。这是写数据成功与否的标志。若要发出故障信号,请用错误对象调用回调函数。双工流的可读性和可写性操作完全独立于彼此。这仅仅是将两个特性组合成一个对象。
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及源码解析,将会在年后,陆续补充
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/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...
阅读 1644·2021-11-17 09:33
阅读 3509·2021-11-16 11:40
阅读 3036·2019-08-30 11:23
阅读 1028·2019-08-29 16:36
阅读 2357·2019-08-29 13:23
阅读 1719·2019-08-29 12:59
阅读 1525·2019-08-29 12:42
阅读 1953·2019-08-28 18:22