当前位置:首页 > 日记 > 正文

NodeJS的学习笔记流模块

NodeJS的学习笔记流模块
首先,开放分析

流是一个抽象的接口,通过节点中的许多对象来实现。例如,一个HTTP服务器的请求是一个流,和标准输出流。流是可读,可写或两者。

与流的最早接触始于早期UNIX,几十年的实践证明流思想可以是大量系统的非常简单的开发。

在Unix中,流是通过| 的实现,节点,作为一个内置的流模块,采用了许多核心模块和三方模块。

与UNIX一样,节点流的主要操作是管道(),用户可以使用反压力机制来控制读写平衡。

流可以为开发人员提供一个可重用的统一接口,通过抽象流接口控制流之间的读写平衡。

TCP连接既可读又可写,而HTTP连接则不同。HTTP请求对象是可读的,而HTTP响应对象是可写的。

流的传输过程默认是以缓冲的形式传输的,除非您为他设置其他编码形式,下面是一个示例:

复制代码代码如下所示:

var http =需要('http');

VaR服务器= http.createserver(功能(REQ,RES){

res.writeheader(200,{ 'content-type:中/平原});

res.end(你好,大熊!;

});

(8888)server.listen;

console.log(HTTP服务器运行在8888端口上…);
运行后,会有一个随机码,因为没有设置指定的字符集,例如UTF-8。

只是修改它。

复制代码代码如下所示:

var http =需要('http');

VaR服务器= http.createserver(功能(REQ,RES){

res.writeheader(200,{

内容类型:中/普通字符集= UTF-8的字符集= UTF-8; / /添加

});

res.end(你好,大熊!;

});

(8888)server.listen;

console.log(HTTP服务器运行在8888端口上…);
运行结果:
为什么要使用流

节点中的I/O是异步的,因此对磁盘和网络的读写需要通过回调函数读取数据。下面是一个文件下载示例

上面的代码:

复制代码代码如下所示:

var http =需要('http');

VaR FS =需要('fs);

VaR服务器= http.createserver(功能(REQ,RES){

fs.readfile(__dirname +/数据.txt功能(呃,数据){

res.end(数据);

});

});

(8888)server.listen;
代码可以实现所需的功能,但是服务需要在发送文件数据之前将整个文件数据缓存到内存中,如果文件非常好。

大量的并发会浪费大量的内存,因为用户需要等到整个文件缓存到内存才能接受文件数据,这会导致什么原因呢

用户体验是很坏的。但是很好(REQ,RES)这两个参数均流,所以我们可以使用fs.createreadstream()而不是fs.readfile(如下):

复制代码代码如下所示:

var http =需要('http');

VaR FS =需要('fs);

VaR服务器= http.createserver(功能(REQ,RES){

无功流= fs.createreadstream(__dirname +/数据.txt);

Stream.pipe(RES);

});

(8888)server.listen;
的。管()方法听the'data'and'end事件fs.createreadstream()这样的数据。txt文件不需要缓存。

一个文件,当客户机连接完成时,数据块可以立即发送给客户机。另一个使用管道()的优点是它可以作为一个客户来解决。

读写不平衡是由大的端延迟引起的。

流有五种基本类型:可读的、可写的、转换的、双工的和经典的(使用特定的API)。

二、实例介绍

我们需要使用数据流的数据时,没有安装过的记忆,或当读取和处理更efficient.nodejs提供操作的数据流通过各种流。

作为大文件复制程序的一个例子,我们可以为数据源创建只读数据流。示例如下:

复制代码代码如下所示:

VaR RS = fs.createreadstream(路径);

Rs.on(数据功能(块){

DoSomething(块); / /任何细节,他的发挥

});

Rs.on(函数(){(){

清理();

});
代码中的数据事件不断引发,无论做函数处理。代码可以继续修改来解决这个问题。

复制代码代码如下所示:

VaR RS = fs.createreadstream(SRC);

Rs.on(数据功能(块){

Rs.pause();

DoSomething(块,函数(){(){

Rs.resume();

});

});

Rs.on(函数(){(){

清理();

});
回调是添加到一些功能,所以我们可以暂停读取数据前处理数据并继续处理后的数据读取数据。

此外,我们还可以为数据目标创建一个只写数据流,如下所示:

复制代码代码如下所示:

VaR RS = fs.createreadstream(SRC);

VaR WS = fs.createwritestream(DST);

Rs.on(数据功能(块){

ws.write(块);

});

Rs.on(函数(){(){

Ws.end();

});
做一些改变来写入数据后,只写的数据流,上面的代码看起来像一个文件复制程序,但上面的代码中存在的上述问题,如果写的速度跟不上阅读速度,只是写数据流缓存内会破产。我们可以根据写的返回值。确定输入的数据被写入到目标,或暂时放在缓存中,并根据漏事件来确定什么时间只写数据流缓存中的数据写入到目标,可以传递给下一个写入数据。因此,代码如下:

复制代码代码如下所示:

VaR RS = fs.createreadstream(SRC);

VaR WS = fs.createwritestream(DST);

Rs.on(数据功能(块){

如果(ws.write(块)= false){

Rs.pause();

}

});

Rs.on(函数(){(){

Ws.end();

});

Ws.on('drain,函数(){(){

Rs.resume();

});
最后,数据流从只读数据流只有实现了数据流、防爆仓库控制。因为有很多应用场景,比如大文件复制程序上,Nodejs直接提供。管的方法来做这件事,和其内部的实现类似于上面的代码。

下面是一个比较完整的复制文件的过程:

复制代码代码如下所示:

VaR FS =需要('fs),

路径=需要('path),

= process.stdout;

var文件路径= / /只大熊MKV的BB;

无功readstream = fs.createreadstream(路径);

无功writestream = fs.createwritestream(MKV文件。);

var属性= fs.statsync(路径);

VaR stat.size规模=;

无功passedlength = 0;

无功lastsize = 0;

VaR StartTime = Date.now();

readstream.on(数据功能(块){

passedlength = chunk.length;

如果(writestream.write(块)= false){

readstream.pause();

}

});

readstream.on(最终,函数(){(){

WriteStream.end();

});

writestream.on('drain,函数(){(){

ReadStream.resume();

});

setTimeout(函数(){)

无功率= math.ceil((passedlength /规模)×100);

无功大小= math.ceil(passedlength / 1000000);

不同尺寸lastsize var =;

lastsize =尺寸;

out.clearline();

(0)out.cursorto;

out.write('completed +规模+ 'mb + % +,+速度:diff * 2 + 'mb / S);

如果(passedlength < TotalSize){

setTimeout(,500);

{人}

VaR结果= Date.now();

console.log();

console.log('shared:+(结束时间-开始时间)/ 1000 +秒。);

}

},500);
我们可以把上面的代码保存为拷贝并测试它。我们添加了一个递归的setTimeout(或直接使用setInterval)使观众。

一旦观察到每隔500ms,进步一次完成,以及完成的尺寸、比例和复制速度写入控制台。复制完成后,计算所花费的总时间。

三,总结

(1)理解流的概念。

(2)熟练使用api相关的流

(3)注意控件的细节,如:大文件的拷贝,利用分段数据的形式进行分段处理。

(4)管道的使用

(5)再次强调了一个概念:TCP连接既可读又可写,而HTTP连接则不同。HTTP请求对象是可读的,而HTTP响应对象是可写的。

相关文章

ai做了一个简单的网页教程

ai做了一个简单的网页教程

教程,网页,简单,电脑软件,ai,本教程主要介绍给朋友,利用AI创建一个简单的网页界面方法。本教程制作的网页比较简单,非常适合初学者学习。推荐朋友一起学习。 在本教程中,ai学习朋友将学习AI创建一个简单的网页界面方法。教程比较简单。像你的…

支持Unicode字符集的Javascript语言

支持Unicode字符集的Javascript语言

字符集,语言,支持,电脑软件,Unicode,上个月,我做了一个分享,详细介绍了Unicode字符集,以及Javascript语言的支持。 1。什么是Unicode Unicode源于一个非常简单的想法:世界上所有的字符都包含在一个集合中。如果计算机支持这个字符集,它将显示所有字…

PS图象处理软件网页游戏UI设计的主

PS图象处理软件网页游戏UI设计的主

网页,图象处理,教程,网页游戏,布朗,本课程的重点是网页首页的设计。我们需要根据客户的要求确定网页内容,然后收集相关资料,根据我们的创意,使画面美观、视觉冲击。 来源:VC作者:畅游VC 本课程的重点是网页首页的设计。我们需要根据客户的要求…

单幅浏览的javascript实现

单幅浏览的javascript实现

浏览,单幅,电脑软件,javascript,使用空闲时间和学习Javascript语言,编写一个链接来浏览单个图片。 复制代码代码如下所示: 图像画廊 功能showpic(whichpic){ 无功源= whichpic.getattribute(href); / / href属性获取点击元素的当前值 VaR的占位符= d…

PS图象处理软件层简单画一个栩栩如

PS图象处理软件层简单画一个栩栩如

栩栩如生,图象,处理软件,画一,简单,下面的朋友详细的PS图象处理软件层绘制一个真实的使用荷包蛋。荷包蛋真的是真的,而且这个教程的难度不是很大。 本教程介绍给朋友,使用PS图象处理软件层绘制一个真实的荷包蛋简单。教程比较简单。荷包蛋真…

使用PS图象处理软件的一个好办法一

使用PS图象处理软件的一个好办法一

一幅,图象,好办法,处理软件,电脑软件,接下来,萧边向您介绍使用PS图象处理软件制作图片与另一张图片合并。这个教程很好。我推荐给你喜欢的朋友。你可以一起学习。 利用PS图象处理软件图片与另一相结合,可以。 1,选择图片,执行羽化,然后反选,再按…

烟花画写实中国象棋棋子

烟花画写实中国象棋棋子

中国象棋,棋子,烟花,电脑软件,本教程是向大家介绍利用烟花来绘制逼真的中国象棋棋子,画画的方法很简单,建议你喜欢的朋友学习跟随。 烟花图案有多种填充形式。如果能充分展示其图案的纹理特征,就可以很方便地绘制各种图形的逼真效果。现在,我…

ajax四要素的关系介绍

ajax四要素的关系介绍

四要,关系,电脑软件,ajax,通过使用Javascript来操作DOM元素刷新页面和重组数据,CSS可以为应用程序提供一个一致的接口,利用XMLHttpRequest对象与服务器进行异步通信,提交请求,在背景和获得的最新数据,定义了业务规则和流程。应用程序获取数据从服务器…

3实现在Node.js同步操作

3实现在Node.js同步操作

同步操作,电脑软件,Node,js,众所周知,异步的特点和优势是得天独厚的,但在同步过程中同时需要(如执行控制程序:订单-> -> func1 func2 func3)也很常见。本文就是记录这个问题的一些想法。 需要执行的函数: 复制代码代码如下所示: VaR func1 =功…

PS图象处理软件对秋天美丽的阳光之

PS图象处理软件对秋天美丽的阳光之

阳光,之美,图象,处理软件,秋天,素描为蓝色和黄色,当材料直接以黄绿色到橙黄色,深色得到蓝色的初步颜色即可;然后将树林中的强光提取出来,用模糊滤镜制作透视灯效果。 素描为蓝色和黄色,当材料直接以黄绿色到橙黄色,深色得到蓝色的初步颜色即可;然…

PS图象处理软件创造了一个时尚、美

PS图象处理软件创造了一个时尚、美

分支,圣诞,图象,处理软件,创造了,本教程介绍PS图象处理软件的朋友创造一个美丽的树支圣诞快乐艺术字的使用方法,本教程是非常可爱的。难度不是很大,建议朋友你喜欢学习的教程在一起。 本文采用PS图象处理软件打造时尚美丽的树枝的圣诞艺术字…

面向对象的关键字用法分析

面向对象的关键字用法分析

关键字,面向对象的,电脑软件,本文的示例分析了Javascript对象的关键字用法,供大家参考,具体分析如下: 当您需要初始化一个属性时,您可以在原型对象中使用这个关键字: 复制代码代码如下所示: 功能人(){ this.name =金美; this.age = 25; }; 新的人(); 新…