stream在Unix系统中是个标准的概念。

In computer programmingstandard 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的更多相关文章

  1. 9、Node.js Stream(流)

    #########################################################################介绍Node.js Stream(流)Stream 是 ...

  2. Node.js stream 流学习

    由于node.js 创建http 是这样的 http.createServer(function(request,response){}).listen(2000); 里面的request 就是rea ...

  3. Node.js Stream(流)

    Stream 是一个抽象接口,Node 中有很多对象实现了这个接口.例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出). Node.js,Str ...

  4. node.js stream

    stream是一个接口,流是可以从一个读取或写入数据的目标对象 ,Node 中有很多对象实现了这个接口   一.nodejs stream类型 1. Readable - 可读操作. Writable ...

  5. [Node.js] Stream all things!

    Node.js come alone with many Stream API. Stream is useful when handling large trunck of data. For ex ...

  6. 24.Node.js Stream(流)

    转自:http://www.runoob.com/nodejs/nodejs-stream.html Stream 是一个抽象接口,Node 中有很多对象实现了这个接口.例如,对http 服务器发起请 ...

  7. 每天学点node系列-stream

    在编写代码时,我们应该有一些方法将程序像连接水管一样连接起来 -- 当我们需要获取一些数据时,可以去通过"拧"其他的部分来达到目的.这也应该是IO应有的方式. -- Doug Mc ...

  8. Node.js Stream - 实战篇

    邹斌 ·2016-07-22 11:04 背景 前面两篇(基础篇和进阶篇)主要介绍流的基本用法和原理,本篇从应用的角度,介绍如何使用管道进行程序设计,主要内容包括: 管道的概念 Browserify的 ...

  9. node.js Stream Buffer FsPromise

    Stream: 类似这样:a.pipe(b).pipe(c); 我想写一个b.所以: var rs=new (require('stream').Readable)(); var ws=new (re ...

  10. Node.js——Stream

    介绍 文件流:我们一般对大一点的文件实现stream的方式进行操作 http:显然http.createServer创建过程中的IncomingMessage实现了可读流的接口,ServerRespo ...

随机推荐

  1. php +go关键字实现协程

    来源: https://studygolang.com/articles/17631?fr=sidebar 今天在知乎浏览时忽然发现了一个有趣的东西,php竟然可以实现协程的实现,而且还是通过go关键 ...

  2. mac使用brew安装mysql5.7

    安装mysql5.7 brew install mysql@5.7 设置环境变量(可能安装完自动生成过了,可以cat ~/.zshrc看一下,有了就不用添加了 ) echo 'export PATH= ...

  3. sql注入学习笔记

    1.什么是SQL注入 SQL注入就是指web应用程序对用户输入的数据的合法性没有判断,前端传入后端的参数带有数据库查询的语句,攻击者可以构造不同的SQL语句来实现对数据库的操作. 2.SQL注入原理 ...

  4. 如何在 Inno Setup 中执行命令行的命令

    Pascal Scripting: Exec Prototype: function Exec(const Filename, Params, WorkingDir: String; const Sh ...

  5. Apache Commons Lang » 3.10使用简介

    ============================================================= 行文介绍: 1.诞生背景 2.引入方案 3.简单介绍 4 .详情介绍 文档: ...

  6. HDU 6341 Let Sudoku Rotate

    #include<bits/stdc++.h> using namespace std; #define rep(i,a,b) for(int i=a;i<=b;++i) #defi ...

  7. java之 惰性初始化

    class Soap { private String s; Soap(){ System.out.println("Soap()"); s="Constructed&q ...

  8. 如何在linux服务器下快速安装配置Node.js

    简单粗暴,先用xshell或其他软件连接服务器 1.下载(此处版本根据官网版本自己修改) wget https://npm.taobao.org/mirrors/node/v8.9.3/node-v8 ...

  9. POJ 2136 Vertical Histogram(当时写的比较恶心,优化一下)

    Vertical Histogram Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 21223 Accepted: 10048 ...

  10. web安全笔记

    判断网站是否伪静态 把.html后缀即可或者加.php?id=99 例子:33_99.html   去掉.html和_变成33.php?id=99 即可判断是否伪静态 判断网站是否在win或者linu ...