node.js读写流以及管道pipe的使用

在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指的是字符型

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章