Stream:

  类似这样:a.pipe(b).pipe(c); 我想写一个b。所以:

var rs=new (require('stream').Readable)();
var ws=new (require('stream').Writable)();rs._read=function(){this.push('send a msn for the first time');this.push('send a msn for the second time');this.push(null);
}ws._wirte=function(chunk,encoding,next){console.log(chunk.toString());next()
}var Duplex=function(){let duplex= new (require('stream').Duplex)();duplex._read=function(){this.push(null);}duplex._write=function(chunk,e,callback){this.push(chunk.toString()+'...by ztw');next()}return duplex;
}
var myDuplex=Duplex();rs.pipe(myDuplex).pipe(ws);

  最后正常显示:

Buffer:

 先说概念:

  Unicode定义码点,utf8配置字节如何对应码点。

  Buffer,你能看到是Unicode 16进制码的形式储存。

  Buffer[0],这种返回的是10进制的Unicode码,这和'string'.charCodeAt(0)是一样的。

  JS对4字节的Unicode码支持不好,'string'.length不对。使用:[...'string'].length。

var buffer=new Buffer('Buffer Test','utf8');buffer.toString('utf8',0,4);   // 'Buff'   位置按buffer内的位置算,非String的位置。buffer.copy(buffer2, targetStart, sourceStart, sourceEnd) ;// 说形象点,按照[sourceStart,sourceEnd]对buffer进行裁剪,并从buffer2的targetStart位置,开始替换。buffer.fill('shit' ,  sourceStart, sourceEnd );//使用shit在buffer的裁剪区域进行填充,填充方式为:repeat;buffer.fill('shit') //全部填充buffer.write('strawberry', start,end);   //替换某个位置。Buffer.concat([buf1,buf2]); //合并两个Buffer;

  详见官方API;

JS中有原生的buffer支持,ArrayBuffer,举个例子:

var arryBuffer=new ArrayBuffer(10);   //Buffer,拥有10个字节的容量。
var arr1=new Int8Array(arryBuffer);//每个Int8Array(Unit8Array...)都带有一个ArrayBuffer。这里显示申明了而已。我们可以这样获得它:var buf=arr1.buffer;   //buf指向arryBuffer,两者是一样的。var arr2=new Int8Array(buf) ; //arr2与arr1使用同一空间,二者关联,值也相同。
var arr2=new Int8Array(buf.slice(5)); //只将5以后的空间分配给arr2,而arr1仍然全部占有。
new Buffer(buf) //可以得到这个Buffer。只能在nodeJs端使用。buf.typeLength  // 返回buf的字节容量大小。

  

FsPromise:

  nodeJS没有提供FS的promise模块,需要自己包装:

function fsPromise(method){return function(...args){return new Promise((resolve,reject)=>{method.apply(method,args.concat([(err,data)=>{resolve(data)}]))})}
}

  写一个最简单直接的,其他功能可以在这基础上变通。

  最后使用:

  fsPromise(fs.readFile)('fileName','utf8').then(val=>console.log(val));

FsPromise为了跳出callBack的嵌套。还可以这样:

function thunkify(method){return function(){return function(...args){return function(fn){method(...args,fn);  //相同于 method.apply(method, args.concat[fn]);};}  }
}

  先想定义一个thunkify;再接着写:

var readFile=thunkify(fs.readFile);
var FsGen=function* (){yield readFile('fileOne','utf8');yield readFile('fileTwo','utf8');
}var fg=FsGen();
nextFile();              //调用nextFile,按顺序异步读取文件。function nextFile(err,data){let result=fg.next();data?console.log(data):0;if(!result.done) result.value(nextFile);
}

  同样跳出callback嵌套。而generators 配合thunkify函数,可以异步处理更多的文件。

使用thunkify,为了让readFile再返回一个function,并在其中执行fg.next()。如果在readFile中执行fg.next()。会返回Generators is aready running;

--------------------------来一个FsPromise的实例-----------------------------

function toPromise(method){return function(){return functin(...args){return new Promise((resolve,reject)=>{method(...args,(...data)=>{resolve(data);   //把它小小升级一下,data为array型,以支持不同参型。})})}}
}process.stdin.setEncoding('utf8');
const stdinOnce=process.stdin.once.bind(process.stdin);//记得bind;toPromise(stdinOnce)('data').then(val=>{process.stdout.write(...val);console.log('step1');return toPromise(stdinOnce)('data');
})
.then(val=>{process.stdout.write(...val);console.log('step2');return toPromise(stdinOnce)('data');
})
.then(val=>{console.log('end');process.stdout.end();
})

  实现一个,按步骤根据用户输入就来进行回应的,大致框架。

因为fs.readFile本身是一个obj,所以可以直接toPromise(fs.readFile)。

  而process.stdin.one是一个方法,直接另名为stdinOnce,会丢失内部的this。

  而使用method.call(process.stdin),也不可取。

  所以:

       const stdinOnce=process.stdin.once.bind(process.stdin);

转载于:https://www.cnblogs.com/ztwBlog/p/6257231.html

node.js Stream Buffer FsPromise相关推荐

  1. Node.js Stream - 基础篇

    背景 在构建较复杂的系统时,通常将其拆解为功能独立的若干部分.这些部分的接口遵循一定的规范,通过某种方式相连,以共同完成较复杂的任务.譬如,shell通过管道|连接各部分,其输入输出的规范是文本流. ...

  2. 7.node.js的Buffer(缓冲区)的合并(concat)、比较(compare)、拷贝(copy)和裁剪(slice)以及如何转化为JSON对象

    文章目录 node.js的Buffer(缓冲区)之二 如何将Buffer转化为JSON对象 Buffer的合并(concat)和比较(compare) Buffer的拷贝(copy)和裁剪(slice ...

  3. Node.js Stream(流) 简单易懂全解析

    一.node.js中的流是什么 stream(流)是Node.js提供的又一个仅在服务区端可用的模块,流是一种抽象的数据结构.Stream 是一个抽象接口,Node 中有很多对象实现了这个接口.例如, ...

  4. Node.js stream模块(一)可读流

    目录 fs.readFile的问题 如何设计出内存友好的,且人性化的数据生产与消费模式 stream模块 创建可读流对象 _read的作用 push的作用 可读流对象的缓冲区buffer 水位线hig ...

  5. Node.js -- Stream 使用小例 ( 流运用 :读取、写入、写出、拷贝)

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. Stream 是一个抽象接口,Node 中有很多对象实现了这个接口.例如,对http 服务器发起请求 ...

  6. node.js Stream(流) 和 EJS 模板引擎——0822

    一.node.js 中的 Stream(流) 1.什么是 Stream ? Stream 是一个抽象接口,Node 中有很多对象实现了这个接口.例如,对http服务器发起请求的request 对象就是 ...

  7. node.js 系列——Buffer

    Buffer缓存对象 纯粹的Javascript 对Unicode 很友好,但是操作二进制数据就不怎么在行了.处理TCP 数据流或者文件时,必 须要操作二进制数据流.node 提供了一些方法来创建.操 ...

  8. Node.js:Buffer基础

    文章目录 创建Buffer对象 Buffer对象的常用方法 1. Buffer.from(string[, encoding]) 2. Buffer.from(array) 3. Buffer.all ...

  9. 【NODE.JS】Buffer

    Buffer是一个Array的对象,主要用于操作字节. 目录 1. 模块结构 2. Buffer对象 3. Buffer内存分配 4. Buffer的转换 5. Buffer的拼接 6. 正确拼接Bu ...

最新文章

  1. 201503-4 网络延时 (本质是求树的最长路径)
  2. 学到了关于服务器磁盘阵列
  3. angularjs html编辑器,AngularJS集成wangeditor富文本编辑器
  4. stm32仿真不能设置断点_使用LiteOS Studio图形化查看LiteOS在STM32上运行的奥秘
  5. 两个前置摄像头_前后六颗摄像头?vivo V17 Pro率先实现升降式前置双摄
  6. Scratch3.0----函数(1)
  7. QT+opencv学习笔记(5)——霍夫直线检测、圆检测及椭圆检测
  8. 个人中心页面的UI设计知识点
  9. 金仓数据库KingbaseES客户端编程接口指南-ODBC(6. KingbaseES ODBC 的扩展属性)
  10. 打开计算机无法最小化,软件一打开就最小化到任务栏怎么办_电脑打开程序它就最小化的解决方法...
  11. 【转】游戏开发高度图有关资料与Balder中的相关支持
  12. MQTT-java使用说明
  13. AtCoder题解——Beginner Contest 167——C - Skill Up
  14. 已开源!Flutter 流畅度优化组件 Keframe | 开发者说·DTalk
  15. 端元提取——纯像元指数PPI
  16. 那些深藏在记忆深处的片段 动漫篇 国外动漫部分(排名不分先后)
  17. 详解矩阵的特征值和特征向量
  18. linux添加多个workspace方法,使用workspace管理多个project
  19. 局域网中“隐身”妙招 类似360的局域网隐身
  20. 【idea错误】open matching files in associated application

热门文章

  1. springboot+sockjs进行消息推送(一对一模式)
  2. 对JavaScript内置对象arguments的一些见解
  3. OpenCv: 二维坐标的旋转方程
  4. Flutter 动画组件
  5. 文件操作中关于文件句柄的相关操作
  6. python练习笔记——分解质因数
  7. Java入门 简易计算器
  8. Linux移植随笔:终于解决Tslib的问题了【转】
  9. AngularJS学习!
  10. 炫酷实用的jQuery插件 涵盖菜单、按钮、图片