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);

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. 用powershell+excel行列转置三步走

    本文重点讲解第一步,手动在excel表中输入公式,或者用powershell自动输入公式. 第二步,用powershell向excel中写入数据,略. 第三步,用powershell从excel中读取 ...

  2. android studio 中依赖库compile 的一些库的地址

    1.添加Gson的依赖库 compile 'com.google.code.gson:gson:2.2.4' 2.使用Volley执行网络数据传输的依赖库 compile 'com.mcxiaoke. ...

  3. $.getJSON('url',function(data){}) 中回调函数不执行

    $.getJSON('url',function(data){}) 中回调函数不执行 url 中的 json 格式不正确 ,浏览器返回并没有报错 {'湖北':[114.11438,30.849429] ...

  4. jquery如何根据text选择option

    百度出来的代码都是这样的: $('#test option[text="b"]').attr("selected",true); 或 $('#test').fi ...

  5. 弹性盒子之wap端布局

    发现移动端用弹性盒子布局起来更加的方便,box-flex:val;特别是图文展示的时候,如下面的 <!DOCTYPE html> <html> <head> < ...

  6. spring aop 声明式事务管理

    一.声明式事务管理的概括 声明式事务(declarative transaction management)是Spring提供的对程序事务管理的方式之一. Spring的声明式事务顾名思义就是采用声明 ...

  7. http 请求详解大全

    HTTP 100 Continue继续 101 Switching Protocols切换协议 200 OK正常 201 Created已创建 202 Accepted已接受 203 Non-Auth ...

  8. 安全协议系列(五)---- IKE 与 IPSec(中)

    在上一篇中,搭建好了实验环境.完整运行一次 IKE/IPSec 协议,收集相关的输出及抓包,就可以进行协议分析.分析过程中,我们将使用 IKE 进程的屏幕输出和 Wireshark 抓包,结合相关 R ...

  9. JAVA中管道通讯(线程间通讯)例子

    Java I/O系统是建立在数据流概念之上的,而在UNIX/Linux中有一个类似的概念,就是管道,它具有将一个程序的输出当作另一个程序的输入的能力.在Java中,可以使用管道流进行线程之间的通信,输 ...

  10. Tabbed Activity的使用(Fragment)

    1,首先file -> new -> Activity -> Tabbed Activity 2,创建完成后,发现会自动的创建一大堆代码,大部分我们是不需要关心的,关于页面切换的代码 ...