node的stream
stream在Unix系统中是个标准的概念。
In computer programming, standard streams are preconnected input and output communication channels[1] between a computer program and its environment when it begins execution. The three I/O connections are called standard input (stdin), standard output (stdout) and standard error (stderr). Originally I/O happened via a physically connected system console (input via keyboard, output via monitor), but standard streams abstract this. When a command is executed via an interactive shell, the streams are typically connected to the text terminal on which the shell is running, but can be changed with redirection, e.g. via a pipeline. More generally, a child process will inherit the standard streams of its parent process.
以上摘自维基,说‘标准流’是在计算机程序开始执行时,已经预先在计算机程序及其运行环境间(个人觉得终端和文件系统间比较好理解)搭建好的输入输出通信管道。标准流抽象了原先的输入输出,更专注在数据的流通层面。
流的一个重要特征是,将数据的流通看成是一段一段的;也就是说一个文件,你不需要整个完全下载完才能操作,可以一部分一部分地读取,对已经读取的部分进行边操作。当然,不同语言对流都有各自的接口实现,不过抽象意义上是一样的。
在nodejs中,流Stream也是一个抽象的接口。在很多模块中都有体现,http、TCP socket、fs等;
而且流是以buffer的形式存在,非常方便我们对其操作;
另外,所有的流都是eventEmitter的实例,故而可以以事件驱动的方式执行异步。
下面是在慕课网学习时跟着编的一个例子:
var readstream=fs.createReadStream('./xiaoyu.mp4');
var writestream=fs.createWriteStream('./xiaoyu2.mp4');
readstream.on('data',function(chunk){
if(writestream.write(chunk)===false){
console.log('still cached')
readstream.pause();
}
})
readstream.on('end',function(){
writestream.end();
})
writestream.on('drain',function(){
console.log('drain')
readstream.resume()
})
//直接pipe()
fs.createReadStream('/path/to/source').pipe(fs.createWriteStream('/path/to/dest'));
合着在网上看到的一些资料做个说明。fs.readFile是把整个文件读到内存中的,但是用.createReadFile()和.createWriteFile()则是读一部分写一部分,适合大文件按读写的情况。
代码第4行:writestream.write(chunk):true代表chunk已经写完,可以继续读入,false表示不应该继续读入,要.pause()。
--The return value is true if the internal buffer is less than the highWaterMark configured when the stream was created after admitting chunk. If false is returned, further attempts to write data to the stream should stop until the 'drain' event is emitted.
stream有4中类型:Readble、Writable、Duplex、Transform
Readble:可读流,提供数据 .pause() .resume()
Writable:可写流,消费data,从Readble读取数据后对buffer处理
Duplex:实现了上面两个的接口,有TCP sockets 、zlib streams 、crypto streams
Transform:也继承了读写接口,但是不缓存数据,只是处理经过它的数据,有zlib streams 、crypto streams
node的stream的更多相关文章
- 9、Node.js Stream(流)
#########################################################################介绍Node.js Stream(流)Stream 是 ...
- Node.js stream 流学习
由于node.js 创建http 是这样的 http.createServer(function(request,response){}).listen(2000); 里面的request 就是rea ...
- Node.js Stream(流)
Stream 是一个抽象接口,Node 中有很多对象实现了这个接口.例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出). Node.js,Str ...
- node.js stream
stream是一个接口,流是可以从一个读取或写入数据的目标对象 ,Node 中有很多对象实现了这个接口 一.nodejs stream类型 1. Readable - 可读操作. Writable ...
- [Node.js] Stream all things!
Node.js come alone with many Stream API. Stream is useful when handling large trunck of data. For ex ...
- 24.Node.js Stream(流)
转自:http://www.runoob.com/nodejs/nodejs-stream.html Stream 是一个抽象接口,Node 中有很多对象实现了这个接口.例如,对http 服务器发起请 ...
- 每天学点node系列-stream
在编写代码时,我们应该有一些方法将程序像连接水管一样连接起来 -- 当我们需要获取一些数据时,可以去通过"拧"其他的部分来达到目的.这也应该是IO应有的方式. -- Doug Mc ...
- Node.js Stream - 实战篇
邹斌 ·2016-07-22 11:04 背景 前面两篇(基础篇和进阶篇)主要介绍流的基本用法和原理,本篇从应用的角度,介绍如何使用管道进行程序设计,主要内容包括: 管道的概念 Browserify的 ...
- node.js Stream Buffer FsPromise
Stream: 类似这样:a.pipe(b).pipe(c); 我想写一个b.所以: var rs=new (require('stream').Readable)(); var ws=new (re ...
- Node.js——Stream
介绍 文件流:我们一般对大一点的文件实现stream的方式进行操作 http:显然http.createServer创建过程中的IncomingMessage实现了可读流的接口,ServerRespo ...
随机推荐
- python在linux调用shell脚本实时打印输出信息并对信息进行判断
核心代码 def run(command): #实时获取打印的命令 process = Popen(command, stdout=PIPE, shell=True) while True: line ...
- vue2.x学习笔记(二十五)
接着前面的内容:https://www.cnblogs.com/yanggb/p/12677019.html. 过滤器 vue允许开发者自定义过滤器,可被用于一些常见的文本格式化.过滤器可以用在两个地 ...
- 实现QQ内打开链接跳转至浏览器
经常遇到域名拦截的问题,不管是QQ还是微信在移动端如果打开被拦截是件很麻烦的事情. 那么,你怎样才能有效地避免这个问题呢?很多站长说域名可以抵御拦截?但是你有没有想过域名拦截的机制是什么? <? ...
- 【Linux常见命令】tree命令
tree - list contents of directories in a tree-like format. tree命令用于以树状图列出目录的内容. 执行tree指令,它会列出指定目录下的所 ...
- pvresize
lvm pv 扩容 pvresize 当PV对应的设备分区(如md软raid)扩容之后,利用该命令可以扩容PV
- SQL语句学习(一)
这篇文章用来记录再学习SQL语句的过程. 首先,我们从简单的创建表开始.创建表的语法是CREATE TABLE 表名(列1的名字 列1的属性,列2的名字 列2的属性...); 如果希望将某一列作为 ...
- 通过express框架为前端提供api(数据),妈妈再也不用担心后端不给我数据了~
个人网站 https://iiter.cn 程序员导航站 开业啦,欢迎各位观众姥爷赏脸参观,如有意见或建议希望能够不吝赐教! 首先,确保自己安装了express框架. 没有安装的同学可以参照下面这篇博 ...
- log4net进阶手札(二):基本用法
本节将主要在WebSite中,对保存日志在文本文件的基本用法来进行介绍,并结合WebForm的初始化方式区别进行说明,解决方案如下图所示: 一.WebSite应用第1步:配置Web.Config文件, ...
- NodeJS实现websocket代理机制
使用的模块 ws http http-proxy 主要通过htt-proxy实现中转 启动websocket服务 var WebSocketServer = require('ws').Server; ...
- 洛谷P3360偷天换日(树形DP)
题目背景 神偷对艺术馆内的名画垂涎欲滴准备大捞一把. 题目描述 艺术馆由若干个展览厅和若干条走廊组成.每一条走廊的尽头不是通向一个展览厅,就 是分为两个走廊.每个展览厅内都有若干幅画,每副画都有一个价 ...