stream流 都是events.EventEmitter的一个实例,都可以来创建自定义事件(也就是说,流是一个事件的实例)
在nodejs中 对http的请求与响应都是用流来实现的,请求就是一个输入的流,响应就是一个输出的流
使用stream流,可以提高性能,前面说的读写文件,是一次性把文件放在内存中,这样就不大合适了,而stream流,是将读取的文件放在Buffer(缓存)中。就是一边放,一边处理,steam流有两个好处,就是处理数据和提高性能。
下面来实现一个流:
var fs = require('fs'); var myReadStream = fs.createReadStream(__dirname+"/readMe.txt","utf8");//创建一个读取流的实例 var data="";//创建一个变量来接收文件 myReadStream.on("data",function(chunk){//data是在接收数据的时候用的监听函数 当文件很大时,是把文件分成很多Buffer来接收的 所以这个函数可能执行多次 data+=chunk; }) myReadStream.on("end",function(){//end是接收完毕后的监听函数 console.log(data); })
上诉代码,如果不设置编码为utf8,data值将会为Buffer,看着是一串数字
当然,还可以另一种设置编码的方式:
var myReadStream = fs.createReadStream(__dirname+"/readMe.txt");//创建一个读取流的实例 myReadStream.setEncoding("utf8");//设置编码 var data="";//创建一个变量来接收文件 myReadStream.on("data",function(chunk){//data是在接收数据的时候用的监听函数 当文件很大时,是把文件分成很多Buffer来接收的 所以这个函数可能执行多次 data+=chunk; }) myReadStream.on("end",function(){//end是接收完毕后的监听函数 console.log(data); })
在原来的基础上写一个写入流:
var myReadStream = fs.createReadStream(__dirname+"/readMe.txt");//创建一个读取流的实例 var myWriteStream = fs.createWriteStream(__dirname+"/writeMe.txt");//创建一个写入流 myReadStream.setEncoding("utf8");//设置编码 myReadStream.on("data",function(chunk){//data是在接收数据的时候用的监听函数 当文件很大时,是把文件分成很多Buffer来接收的 所以这个函数可能执行多次 myWriteStream.write(chunk);//将读取到的片段写入,参数就是要写入的内容 }) myReadStream.on("end",function(){//end是接收完毕后的监听函数 })