node的stream

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的实例,故而可以以事件驱动的方式执行异步。

下面是在慕课网学习时跟着编的一个例子:

 1 var readstream=fs.createReadStream(‘./xiaoyu.mp4‘);
 2 var writestream=fs.createWriteStream(‘./xiaoyu2.mp4‘);
 3 readstream.on(‘data‘,function(chunk){
 4     if(writestream.write(chunk)===false){
 5         console.log(‘still cached‘)
 6         readstream.pause();
 7     }
 8 })
 9 readstream.on(‘end‘,function(){
10     writestream.end();
11 })
12 writestream.on(‘drain‘,function(){
13     console.log(‘drain‘)
14     readstream.resume()
15 })
16 //直接pipe()
17 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

时间: 2024-10-12 21:26:36

node的stream的相关文章

Node Buffer/Stream 内存策略分析

在Node 中,Buffer 是一个广泛用到的类,本文将从以下层次来分析其内存策略: User 层面,即Node lib/*.js 或用户自己的Js 文件调用 new Buffer Socekt read/write File read/write User Buffer 在 lib/buffer.js 模块中,有个模块私有变量 pool, 它指向当前的一个8K 的slab : Buffer.poolSize = 8 * 1024; var pool; function allocPool()

node readable stream 数据读取方式

A Readable stream will not start emitting data until you indicate that you are ready to receive it. Readable streams have two "modes": a flowing mode and a paused mode. When in flowing mode, data is read from the underlying system and provided t

[Node.js]Stream

摘要 Stream是一个抽象接口,Node中有很多对象实现了这个接口.例如,对http服务器发送请求的request对象就是一个Stream. Stream Stream有四种流类型: Readable:可读操作. Writable:可写操作. Duplex:可读写操作. Transform:操作被写入数据,然后读出结果. 所有Stream对象都是EventEmitter的实例,常用的事件: data:当有数据可读时触发. end:没有更多的数据可读时触发. error:在接收和写入过程中发生错

Node.js Stream(流)

Stream 是一个抽象接口,Node 中有很多对象实现了这个接口.例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出). Node.js,Stream 有四种流类型: Readable - 可读操作. Writable - 可写操作. Duplex - 可读可写操作. Transform - 操作被写入数据,然后读出结果. 所有的 Stream 对象都是 EventEmitter 的实例.常用的事件有: data - 当有数据可读时触发.

node.js Stream Buffer FsPromise

Stream: 类似这样:a.pipe(b).pipe(c); 我想写一个b.所以: var rs=new (require('stream').Readable)(); var ws=new (require('stream').Writable)(); rs._read=function(){ this.push('send a msn for the first time'); this.push('send a msn for the second time'); this.push(n

Node.js Stream - 实战篇

邹斌 ·2016-07-22 11:04 背景 前面两篇(基础篇和进阶篇)主要介绍流的基本用法和原理,本篇从应用的角度,介绍如何使用管道进行程序设计,主要内容包括: 管道的概念 Browserify的管道设计 Gulp的管道设计 两种管道设计模式比较 实例 Pipeline 所谓“管道”,指的是通过a.pipe(b)的形式连接起来的多个Stream对象的组合. 假如现在有两个Transform:bold和red,分别可将文本流中某些关键字加粗和飘红.可以按下面的方式对文本同时加粗和飘红: //

Node.js——Stream

介绍 文件流:我们一般对大一点的文件实现stream的方式进行操作 http:显然http.createServer创建过程中的IncomingMessage实现了可读流的接口,ServerResponse实现了可写流的借口 文件流 写入流的close事件,必须通过ws.end() 方法来调用 文件的默认是flags是w,这是覆盖操作,追加的话是a var fs = require('fs') var rs = fs.createReadStream('./a.txt') var ws = fs

简单了解node stream

Almost all Node.js applications, no matter how simple, use streams in some manner. 开篇先吓吓自己.画画图,分析分析代码加深自己的理解. stream基本概念 Writable - 可写入数据的流 Readable - 可读取数据的流 node中其它模块stream 的应用 总结 1.stream基本概念 1.1什么是 stream 1. 在编写代码时,我们应该有一些方法将程序像连接水管一样连接起来 -- 当我们需

爱你不容易 —— Stream详解

作为前端,我们常常会和 Stream 有着频繁的接触.比如使用 gulp 对项目进行构建的时候,我们会使用 gulp.src 接口将匹配到的文件转为 stream(流)的形式,再通过 .pipe() 接口对其进行链式加工处理: 或者比如我们通过 http 模块创建一个 HTTP 服务: const http = require('http'); http.createServer( (req, res) => { //... }).listen(3000); 此处的 req 和 res 也属于