node读写流以及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指的是字符型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值