Stream:

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

  1. var rs=new (require('stream').Readable)();
  2. var ws=new (require('stream').Writable)();
  3.  
  4. rs._read=function(){
  5. this.push('send a msn for the first time');
  6. this.push('send a msn for the second time');
  7. this.push(null);
  8. }
  9.  
  10. ws._wirte=function(chunk,encoding,next){
  11. console.log(chunk.toString());
  12. next()
  13. }
  14.  
  15. var Duplex=function(){
  16. let duplex= new (require('stream').Duplex)();
  17. duplex._read=function(){
  18. this.push(null);
  19. }
  20. duplex._write=function(chunk,e,callback){
  21. this.push(chunk.toString()+'...by ztw');
  22. next()
  23. }
  24. return duplex;
  25. }
  26. var myDuplex=Duplex();
  27.  
  28. 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。

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

  详见官方API;

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

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

  

FsPromise:

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

  1. function fsPromise(method){
  2. return function(...args){
  3. return new Promise((resolve,reject)=>{
  4. method.apply(method,args.concat([(err,data)=>{resolve(data)}]))
  5. })
  6. }
  7. }

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

  最后使用:

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

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

  1. function thunkify(method){
  2. return function(){
  3. return function(...args){
  4. return function(fn){
  5. method(...args,fn); //相同于 method.apply(method, args.concat[fn]);
  6. };
  7. }
  8. }
  9. }

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

  1. var readFile=thunkify(fs.readFile);
  2. var FsGen=function* (){
  3. yield readFile('fileOne','utf8');
  4. yield readFile('fileTwo','utf8');
  5. }
  6.  
  7. var fg=FsGen();
  8. nextFile(); //调用nextFile,按顺序异步读取文件。
  9.  
  10. function nextFile(err,data){
  11. let result=fg.next();
  12. data?console.log(data):0;
  13. if(!result.done) result.value(nextFile);
  14. }

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

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

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

  1. function toPromise(method){
  2. return function(){
  3. return functin(...args){
  4. return new Promise((resolve,reject)=>{
  5. method(...args,(...data)=>{
  6. resolve(data); //把它小小升级一下,data为array型,以支持不同参型。
  7. })
  8. })
  9. }
  10. }
  11. }
  12.  
  13. process.stdin.setEncoding('utf8');
  14. const stdinOnce=process.stdin.once.bind(process.stdin);//记得bind;
  15.  
  16. toPromise(stdinOnce)('data').then(val=>{
  17. process.stdout.write(...val);
  18. console.log('step1');
  19. return toPromise(stdinOnce)('data');
  20. })
  21. .then(val=>{
  22. process.stdout.write(...val);
  23. console.log('step2');
  24. return toPromise(stdinOnce)('data');
  25. })
  26. .then(val=>{
  27. console.log('end');
  28. process.stdout.end();
  29. })

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

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

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

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

  所以:

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

node.js Stream Buffer FsPromise的更多相关文章

  1. 9、Node.js Stream(流)

    #########################################################################介绍Node.js Stream(流)Stream 是 ...

  2. 笔记:Node.js 的 Buffer 缓冲区

    笔记:Node.js 的 Buffer 缓冲区 node.js 6.0 之前创建的 Buffer 对象使用 new Buffer() 构造函数来创建对象实例,但权限很大,可以获得敏感信息,所以建议使用 ...

  3. [Node.js] 03 - Buffer, Stream and File IO

    fs 模块,视频教学 os 模块,视频教学,api doc Buffer类 创建 Buffer 类 // 创建一个长度为 10.且用 0 填充的 Buffer. const buf1 = Buffer ...

  4. Node.js:Buffer浅谈

    Javascript在客户端对于unicode编码的数据操作支持非常友好,但是对二进制数据的处理就不尽人意.Node.js为了能够处理二进制数据或非unicode编码的数据,便设计了Buffer类,该 ...

  5. [Node.js] Stream all things!

    Node.js come alone with many Stream API. Stream is useful when handling large trunck of data. For ex ...

  6. node.js中buffer需要知道的一些点

    本文为阅读朴灵大大的<深入浅出node.js>笔记: 在前端开发的时候,我们不曾用过buffer,也没得用.buffer是node环境引入的,用来方便应对二进制数据的处理.这里我们对它应该 ...

  7. Node.js stream 流学习

    由于node.js 创建http 是这样的 http.createServer(function(request,response){}).listen(2000); 里面的request 就是rea ...

  8. Node.js学习 - Buffer

    JavaScript 语言自身只有字符串数据类型,没有二进制数据类型.但在处理像TCP流或文件流时,必须使用到二进制数据. 因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门 ...

  9. Node.js Stream(流)

    Stream 是一个抽象接口,Node 中有很多对象实现了这个接口.例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出). Node.js,Str ...

随机推荐

  1. JavaScript 继承

    许多OO语言都支持两种继承方式,接口继承和实现继承.接口继承只继承方法签名,而实现继承则继承实际的方法.由于在ECMAScript中,函数没有签名,无法实现接口继承,只支持实现继承,而且其实现继承主要 ...

  2. DataStructure——红黑树学习笔记

    1.前言 本文伪码和解释参考: http://blog.csdn.net/v_JULY_v/article/details/6105630 C实现的源码本文未贴出,请见: http://blog.cs ...

  3. 【转】输入/输出流 - 全面掌握IO

    File类: 程序中操作文件和目录都可以使用File类来完成即不管是文件还是目录都是使用File类来操作的,File能新建,删除,重命名文件和目录,但File不能访问文件内容本身,如果需要访问文件本身 ...

  4. 对contentoffset的理解

    今天遇到一个问题,在写瀑布流时,竖屏的时候可以正常实现,在手机变成横屏后,总是显示不全. 最终查了两个小时,查到了导致这个的原因,是自己的判断cell是否在当前显示区域的方法写错了. 根本原因是没有很 ...

  5. SharePoint Document Library中的"Versioning Settings"功能与CSOM的对应

     博客地址:http://blog.csdn.net/FoxDave SharePoint文档库关于版本的设置:"Versioning Settings",可以通过CSOM用L ...

  6. SharePoint SC "Audit Settings"功能与CSOM的对应

    博客地址:http://blog.csdn.net/FoxDave SharePoint网站集中有个关于审计的功能:"Site collection audit settings&quo ...

  7. 总结-css编码规范

    一.注释 统一采用 :/* 注释内容 */ 二.命名 1.常用命名(多查单词) 参考命名规范.doc 2.选择器 1> [建议] 选择器的嵌套层级应不大于 3 级,位置靠后的限定条件应尽可能精确 ...

  8. Extjs中引入JSP页面

    有的时候,我们可能要在某个panel中动态的引入一个jsp页面.但是ext中貌似没有这样的方法,所以这时候需要我们自定义一个组件来完成我们的需求. 1.首先定义我们的penel. Ext.define ...

  9. Errore Http 404.2

    问题一:IIS 7.5 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理 404.2就一个http status code, 在msdn上说:404.2 - ISAPI or CGI rest ...

  10. 使用TypeScript开发

    学习过一段时间CoffeeScript,然后再学习TypeScript,最后还是决定使用TypeScript开发. CofeeScript主要是给js添加一些语法糖,编写代码要快捷的多,少量的代码开发 ...