在js代码中,如果我们读取数据或者是打印数据,一般是var 或 let 一个变量,再打印出来
但是这样的方法需要开辟一个新的内存,来保存这个变量
当我们在网页上读取内存较大的文件时(比如视频、图片等),写入写出会极大的占用内存
这时候就需要在node.js中提供给我们的流——stream
stream可以边读边写,这样就可以更好的不占用太多内存,并且完成所需任务
stream分为四种:
readable、writable、duplex、transform(这里各个部分的具体用法可以看stream的详细文档)
而pipe的用法也是这里最常见的
(注意:使用pipe的时候,左侧一定是一个流,右侧也一定是一个流)
在这里,我们可以进行一个简单的流操作
以下是stream.js
var stream = require('stream')
var util = require('util')
function ReadStream(){
stream.Readable.call(this)
}
util.inherits(ReadStream, stream.Readable)
ReadStream.prototype._read = function() {
this.push('我爱\n')
this.push(null)
}
function WritStream(){
stream.Writable.call(this)
}
util.inherits(WritStream, stream.Writable)
WritStream.prototype._write = function(chunk, encode, cb){
console.log(chunk.toString())
cb()
}
function TransformStream(){
stream.Transform.call(this)
}
util.inherits(TransformStream, stream.Transform)
TransformStream.prototype._transform = function(chunk, encode, cb){
this.push(chunk)
cb()
}
TransformStream.prototype._flush = function(cb){
this.push('中国')
cb()
}
var rs = new ReadStream()
var ws = new WritStream()
var ts = new TransformStream()
rs.pipe(ts).pipe(ws)
运行结果为
注意以下几点:
1、虽然我们用util.inherits从stream继承了三种流的方法,但是我们依旧需要在三个函数内部使用call(this),原因是,三种流的方法属于stream的私有方法,若不写call,则无法调用三种方法。
2、_read 指的是ReadStream的prototype(原型链)的私有部分read
3、this.push(null), 告诉读入流结束,若不写,则会出现‘我爱’一直循环的现象
4、rs.pipe(ts).pipe(ws), transform类似于水管的中间部分,这里建立三种流的实例,先读入,再经过transform的加工,最后读出
5、chunk,可以借阅node中buffer的使用方法,其中tostring指的是字符型