node.js使用stream模块实现自定义流示例

来源:脚本之家  责任编辑:小易  

node中有个流的概念,stream。代表数据流动方向:向内流(可读流),向外流(可写流)。常用的流

本文实例讲述了node.js使用stream模块实现自定义流。分享给大家供大家参考,具体如下:

我们可以利用以下算法来创建hash实例md5sha1sha256sha512ri

有些时候我们需要自定义一些流,来操作特殊对象,node.js中为我们提供了一些基本流类。

您好 很高兴为您解这个web服务器包括三块,app.js是程序入口,负责响应url请求;ro

我们新创建的流类需要继承四个基本流类之一(stream.Writeable,stream.Readable,stream.Duplex,stream.Transform),并确保调用了父类构造函数。

nodejs的fs模块并没有提供一个copy的方法,但我们可以很容易的实现一个,比如:var s

一、实现自定义的可读流

1、跨进程通信 新版的nodejs里增加了对子进程的操作,跨进程通信不是问题。 http:/

实现可读流需继承 stream.Readable,并实现 readable._read() 方法。

两年前写下爆红朋友圈辞职信的女老师现在怎么样了?两年后的她,走的路多了,哪有不挨太阳晒的理。目前她和老公在云南的一个小镇开了一家客栈,名叫远归客栈,旺季他们在打理客栈,淡季他们依然外出旅行。近日她出了一本书,这本书记录了她爆红前的生活经历,爆红后的心路历程,以及这两年她”失踪“后行走中遇到的种种历程。生活不止眼前的苟且,还有诗和远方的田野,现代人放不开眼前生活的枷锁,看看旁人的经历,也许也是一种慰藉。

下面的代码我们实现了一个从数组中读取数据的流

男生的头发发质比较硬,两边的头发还炸出来,这样的发型是非常不怎么好看。Hi大家好,我是何有强这样的头发怎么剪才好看呢,经常遇到这样头发硬了客人,两边头发还容易炸出来。剪短发,但是最合适,不错的选择了,留个长发,能够让两边伏贴起来。像下面的图片一样的发型是不现实的。这个时候你应该让发型师帮你把两边的头发剪短,剪个飞机头发型,也是非常不错的选择。两边头发剪短,这样头发就不会炸出来了,但是上面的头发要留长一点,这样的话,做造型会更加的好看。如果你比较会打理发行的话,选择左边的发型,就非常多有层次感。如果你的头发流向是往后的话,也可以弄的大背头发型,会更加的精神

const {Readable} = require('stream'); //这里我们自定义了一个用来读取数组的流 class ArrRead extends Readable { constructor(arr, opt) { //注意这里,需调用父类的构造函数 super(opt); this.arr = arr; this.index = 0; } //实现 _read() 方法 _read(size) { //如果当前下标等于数组长度,说明数据已经读完 if (this.index == this.arr.length) { this.push(null); } else { this.arr.slice(this.index, this.index + size).forEach((value) => { this.push(value.toString()); }); this.index += size; } } } let arr = new ArrRead([1, 2, 3, 4, 5, 6, 7, 8, 9, 0], { highWaterMark: 2 }); //这样当我们监听 'data' 事件时,流会调用我们实现的 _read() 方法往缓冲区中读取数据 //然后提供给消费者 arr.on('data', function (data) { console.log(data.toString()); });

狗是需要定期挤肛门腺的。狗狗有两个肛门腺,分别位于肛门4点和8点钟方向,是两个囊袋样的结构。正常的肛门腺会分泌很多液体,带有特殊的臭味,在狗狗排便时,肛门腺会分泌液体润滑便便,帮助便便顺利排出。狗狗在受到惊吓时,因为收缩肛门,肛门腺受到挤压也会分泌液体。另外,狗狗也会通过分泌肛门腺识别相互之间的气味。肛门腺是一直持续分泌腺体的,需要定期挤肛门腺,排除肛囊里的液体分泌物。如果长时间不挤肛门腺,液体的分泌物就会积累,久而久之,肛门腺就会破溃,破溃的肛门腺会流血,感染,需要持续清创消炎处理,严重者,可能需要手术摘除肛门腺。长期不挤肛门腺也会造成肛周红肿,皮肤化脓,破溃,另外,有些肛门腺破溃反复发作会

二、实现自定义的可写流

谢邀!有句话说得好,人与人之间的差异其实大于人与狗之间的差异。所以,笼统地说女生最喜欢什么样的表白方式,实在是无法给出一个确切的回答。不过,心理学家确实研究过,人类通常会怎样表达和接收爱的信息。美国的心理学家盖瑞·查普曼教授,就曾经提出过这样一种观点,认为人类表达爱情的方式可以分为以下五种(有兴趣的朋友可以看一看他的著作《爱的五种语言》):1.甜言蜜语。简单来说,就是直接通过言语表达自己的情感和爱意。表达的途径可以是当面说、写成书信,或者通过微信和短信表达。2.精心时刻。这指的是一些特别浪漫,经过精心设计过的仪式。比如说在女生宿舍楼下用蜡烛摆个心形等等。3.赠送礼物。相信这种表达爱情的方式人们

实现可写流必须继承 stream.Writeable ,并实现 writeable._write() 方法。writable._writev() 方法是可选的。

const {Writable} = require('stream'); //这里我们自定义了一个用来写入数组的流 class ArrWrite extends Writable { constructor(arr, opt) { super(opt); this.arr = arr; } //实现 _write() 方法 _write(chunk, encoding, callback) { this.arr.push(chunk.toString()); callback(); } } let data = []; let arr = new ArrWrite(data, { highWaterMark: 3 }); arr.write('1'); arr.write('2'); arr.write('3'); console.log(data);

三、实现自定义的可读可写流

可读可写流必须继承 stream.Duplex,并实现 readable._read() 和 writable._write() 方法。

const {Duplex} = require('stream'); //这里我们自定义了一个用来写读可写数组的流 class ArrReadWrite extends Duplex { constructor(arr, opt) { super(opt); this.arr = arr; this.index = 0; } //实现 _write() 方法 _write(chunk, encoding, callback) { this.arr.push(chunk.toString()); callback(); } //实现 _read() 方法 _read(size) { //如果当前下标等于数组长度,说明数据已经读完 if (this.index == this.arr.length) { this.push(null); } else { this.arr.slice(this.index, this.index + size).forEach((value) => { this.push(value.toString()); }); this.index += size; } } } let data = []; let arrWR = new ArrReadWrite(data, { highWaterMark: 3 }); //往流中写入数据 arrWR.write('1'); arrWR.write('2'); arrWR.write('3'); console.log(data); //往流中读取数据 console.log(arrWR.read(2).toString()); console.log(arrWR.read(2).toString());

四、自定义的转换流

转换流必须继承 stream.Transform,需实现 transform._transform() 方法。

const {Transform} = require('stream'); //这里我们自定义了一个用来转换数组的流 class Trans extends Transform { constructor(opt) { super(opt); } _transform(chunk, encoding, callback) { //将转换后的数据输出到可读流 this.push(chunk.toString().toUpperCase()); //参数一是Error对象 //参数二如果传入,会被转发到 readable.push() callback(); } } let t = new Trans({ highWaterMark: 3 }); t.on('data', function (data) { console.log(data.toString()); }); t.write('a'); t.write('b'); t.write('c');

转换流就是将读取到的数据做些计算然后输出。转换流既可以作为可读流,又可以作为可写流。

const {Transform} = require('stream'); //这里我们自定义了一个用来转换数组的流 class Trans extends Transform { constructor(opt) { super(opt); } _transform(chunk, encoding, callback) { //将转换后的数据输出到可读流 this.push(chunk.toString().toUpperCase()); //参数一是Error对象 //参数二如果传入,会被转发到 readable.push() callback(); } } let t = new Trans({ highWaterMark: 3 }); t.on('data', function (data) { console.log('data', data.toString()); }); //stdin.pipe(t) 表示将我们的标准输入写入到我的转换流 t 中,此时 t 是可写流。 //pipe(process.stdout) 表示将转换流 t 中的数据读取到标准输出中,此时 t 是可读流。 process.stdin.pipe(t).pipe(process.stdout);

希望本文所述对大家node.js程序设计有所帮助。

扩展阅读,根据您访问的内容系统为您准备了以下内容,希望对您有帮助。

nodejs中stream.on是什么意思

这种方式是把文件内容全部读入内存,然后再写入文件,对于小型的文本文件,这没有多大问题,比如 grunt-file-copy 就是这样实现的。但是对于体积较大的二进制文件,比如音频、视频文件,动辄几个GB大小,如果使用这种方法,很容易使内存“爆仓”。理想的方法应该是读一部分,写一部分,不管文件有多大,只要时间允许,总会处理完成,这里就需要用到流的概念。

nodejs stream和buffer的区别

max_allowed_packet = 64M

[mysql]

disable-auto-rehash #允许通过TAB键提示

default-character-set = utf8

connect-timeout = 3

node.js stream和buffer有什么区别

buffer

为数据缓冲对象,是一个类似数组结构的对象,可以通过指定开始写入的位置及写入的数据长度,往其中写入二进制数据

stream

是对buffer对象的高级封装,其操作的底层还是buffer对象,stream可以设置为可读、可写,或者即可读也可写,在nodejs中继承了EventEmitter接口,可以监听读入、写入的过程。具体实现有文件流,httpresponse等

如何从字符串中的Node.js创建流

1. 刚创建的一个新实例stream模块,并根据您的需求定制它:

var Stream = require('stream')

var stream = new Stream()

stream.pipe = function(dest) {

dest.write('your string')

}

stream.pipe(process.stdout) // in this case the terminal, change to ya-csv

var Stream = require('stream')

var stream = new Stream()

stream.on('data', function(data) {

process.stdout.write(data) // change process.stdout to ya-csv

})

stream.emit('data', 'this is my string')

2. 将字符串转换为流,通过一个流:

through().pause().queue('your string').end()

例如:

var through = require('through')

// Create a paused stream and buffer some data into it:

var stream = through().pause().queue('your string').end()

// Pass stream around:

callback(null, stream)

// Now that a consumer has attached, don't forget to resume the stream:

stream.resume()

更新:@substack刚刚发布的模块。这就像一个通过()流,但自上nextTick流,当且仅当别人有它在

var resumer = require('resumer')

var stream = resumer().queue('your string').end()

// Now pass `stream` around. No need to resume, it happens automatically.

该resumer().queue('some string').end()idioms是我现在创建adhoc流。这是方便多了,你可以return流,他们还是会得到

3. JavaScript是鸭子类型的 CodeGo.net,所以如果你只是复制一个可读的流的API,它会工作得很好。事实上,你也许可以不是大多数的或刚刚离开他们作为存根,所有你需要的是什么样的你节点的预建EventEmitter类来处理事件,也让你不必addListener和这样的自己。 这里是你如何可能它的CoffeeScript:

class StringStream extends require('events').EventEmitter

constructor: (@string) -> super()

readable: true

writable: false

setEncoding: -> throw 'not implemented'

pause: -> # nothing to do

resume: -> # nothing to do

destroy: -> # nothing to do

pipe: -> throw 'not implemented'

send: ->

@emit 'data', @string

@emit 'end'

那么你也喜欢这样:

stream = new StringStream someString

doSomethingWith stream

stream.send()

node.js 不用文件怎么创建流?

node.js的api里面的stream.Readable和stream.Writable都是抽象的,你得看你具体需要干什么,再完成你自己的Readable或者Writable。比如fs里面createReadStream返回的是fs里面继承自Readable的ReadStream,net里面的Socket是继承自stream.Duplex的可以读也可以写的stream。追问想用pipe方法把一个自己写的mp4数据发送出去直接在html5写的网页上播放(不存在mp4文件)。有没有什么方法建议呢?谢谢!追答

比如你可以:

var Readable = require('stream').Readable;

var stream = new Readable();

var counter = 0;

stream._read = function(size){

if(counter<100)

stream.push('data ' + counter++ + '\n');

else

stream.push(null);

}

stream.pipe(process.stdout);

就是说你得自己实现一个Readable的_read(size)才行,当你pipe的时候,stream会一遍一遍的调用_read,size是stream告诉你它需要多少数据,有些情况像tcp连接、stdio这样的,可以不用管size的大小。在_read里面,你要给stream数据的时候,就用stream.push(data)这样,如果要stream结束,你就stream.push(null),如果stream没结束,但是目前提供不出数据,就stream.push('')。另外,stream调用了一个_read之后,在你调用stream.push之前,它是不会继续调用下一次的_read的,所以如果你实现的_read,即使是在异步的情况下调用stream.push,也不需要担心stream的数据顺序会错乱。

  • 本文相关:
  • 快速了解node中的stream流是什么
  • node.js中你不可不精的stream(流)
  • 详解nodejs文件系统(fs)与流(stream)
  • node.js中流(stream)的使用方法示例
  • 深入nodejs中流(stream)的理解
  • nodejs stream 数据流使用手册
  • node.js中的流(stream)介绍
  • 说说node中的可读流和可写流的区别
  • 浅谈手写node可读流之流动模式
  • node.js中stream流中可读流和可写流的实现与使用方法实例分析
  • node.js中的querystring.escape方法使用说明
  • nodejs简单访问及操作mysql数据库的方法示例
  • 利用yarn代替npm管理前端项目模块依赖的方法详解
  • node.js + socket.io 实现点对点随机匹配聊天
  • node.js中的console.trace方法使用说明
  • nodejs中实现阻塞实例
  • node.js微信小程序配置消息推送的实现
  • 通过node-mysql搭建windows+node.js+mysql环境的教程
  • nodejs实现的一个简单udp广播服务器、客户端
  • 在node.js中怎么屏蔽掉favicon.ico的请求
  • nodejs中stream.on是什么意思
  • nodejs stream和buffer的区别
  • node.js stream和buffer有什么区别
  • 如何从字符串中的Node.js创建流
  • node.js 不用文件怎么创建流?
  • nodejs fs 读取文件流一次读取多少数据
  • nodejs jssha 模块怎么用
  • 如何用用命令行开启nodejs搭建web服务器
  • nodejs fs 文件流传输要不要缓存区
  • 页面怎么用node.js调用mdb数据库
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved