当一个客户端的HTTP 响应对象是一个可读流,那么在服务器端这就是一个可写流。...还要注意,当涉及到子进程时,stdio流(stdin,stdout,stderr)具有逆流类型。这就允许我们非常方便的使用管道从主进程连接子进程的Streams。...The pipe method 要记住下面这个魔幻方法 readableSrc.pipe(writableDest) 在这一行里面,我们通过管道把可读流(源)输出到一个可写流里面去(目标),源必须是一个可写流...可读流上的最重要的事件是 data事件,当可读流传输了一段数据的时候会触发 end事件,当没有数据被传输时触发 可写流上的最重要的事件是 drain事件,当可写流可以接收事件的时候被触发 finish...通过给Writable传递一些参数来创建一个对象。唯一必须要传的选项时write方法,它需要暴漏需要写入的数据块。
事件监听:data:当输入流接收到数据时触发,回调函数的参数是接收到的 Buffer 对象或字符串,具体取决于编码设置。end:当输入流中再没有可读取的数据时触发。error:当输入流发生错误时触发。...数据管道:在 Linux 或其他类 Unix 系统中,输入流可以通过管道操作符传输到 Node.js 程序。...流分为四种类型:Readable:可读流,用于接收数据,例如 process.stdin。Writable:可写流,用于发送数据,例如 process.stdout。...Duplex:双工流,既可读又可写。Transform:变换流,既可读又可写,并能对数据进行修改。...它们决定了数据在流中如何传递:缓冲区:Node.js 为流分配了一个内存区域,用于存储临时数据。如果缓冲区已满,写入操作会被暂停。背压:当数据生产速度超过消费速度时,会触发背压机制。
背景 在构建较复杂的系统时,通常将其拆解为功能独立的若干部分。这些部分的接口遵循一定的规范,通过某种方式相连,以共同完成较复杂的任务。譬如,shell通过管道|连接各部分,其输入输出的规范是文本流。...在Node.js中,内置的Stream模块也实现了类似功能,各部分通过.pipe()连接。...当全部数据都生产出来后,必须调用push(null)来结束可读流。 流一旦结束,便不能再调用push(data)添加数据。 可以通过监听data事件的方式消耗可读流。...Transform 在上面的例子中,可读流中的数据(0, 1)与可写流中的数据('a', 'b')是隔离开的,但在Transform中可写端写入的数据经变换后会自动添加到可读端。...对于可写流来说,write(data)时,data只能是String或Buffer类型,_write(data)调用时传进来的data都是Buffer类型。
如果你已经使用过 Node.js,则可能遇到过流。例如在基于 Node.js 的 HTTP 服务器中,request 是可读流,而 response 是可写流。...例如,每当有几 KB 的数据被读取时,HTTP 请求就可能发出一个数据事件。当从文件中读取数据时,你可能会决定读取一行后就发出数据事件。 当没有更多数据要读取(结束)时,流将发出结束事件。...当没有内容可读取时返回 null。所以在 while 循环中,我们检查是否为 null 并终止循环。请注意,当可以从流中读取大量数据时,将会发出可读事件。...Webp.net-resizeimage 查看更多:Node.js 流速查表【https://devhints.io/nodejs-stream】 以下是与可写流相关的一些重要事件: error –表示在写或配置管道时发生了错误...pipeline – 当把可读流传递到可写流中时,该事件由可写流发出。 unpipe – 当你在可读流上调用 unpipe 并停止将其输送到目标流中时发出。 结论 这就是所有关于流的基础知识。
如果你用过 Node.js,可能已经遇到过流了。例如,在基于 Node.js 的 HTTP 服务器中,request 是可读流,response 是可写流。还有fs 模块,能同时处理可读和可写文件流。...当从可读的流读取数据时,可以使用 async iterator: import * as fs from 'fs'; async function logChunks(readable) { for...当数据块可用时,可读流发出 data 事件并执行回调。...– 当将可读流传递到可写流中时,可写流会发出此事件。...unpipe – 当你在可读流上调用unpipe并停止将其输送到目标流中时发出。 总结 这就是所有关于流的基础知识。 流、管道和链式操作是 Node.js 的核心和最强大的功能。
目录下生成input.txt文件; pipeline stream.pipeline()方法,用于在流和生成器之间进行管道转发错误并正确清理并在管道完成时提供回调。...Readable 和 Writable 接口的流) destination:可写流 callback:管道完成时的回调 pipe readable.pipe() 方法将可写流绑定到可读流,使其自动切换到流动模式并将其所有数据推送到绑定的可写流...将这句话总结一下,pipe方法的主要用途是从可读流中读取数据写入可写流。...用法 readable.pipe(destination[, options]) 示例 可以看官方的示例,简单易懂,将 readable 中的所有数据通过管道传输到名为 file.txt 的文件中: const...流是用于在 Node.js 中处理流数据的抽象接口。 stream 模块提供了用于实现流接口的 API。 流可以是可读的、可写的、或两者兼而有之。
目录下生成input.txt文件;pipelinestream.pipeline()方法,用于在流和生成器之间进行管道转发错误并正确清理并在管道完成时提供回调。...和 Writable 接口的流)destination:可写流callback:管道完成时的回调pipereadable.pipe() 方法将可写流绑定到可读流,使其自动切换到流动模式并将其所有数据推送到绑定的可写流...将这句话总结一下,pipe方法的主要用途是从可读流中读取数据写入可写流。...用法readable.pipe(destination[, options])示例可以看官方的示例,简单易懂,将 readable 中的所有数据通过管道传输到名为 file.txt 的文件中:const...流是用于在 Node.js 中处理流数据的抽象接口。 stream 模块提供了用于实现流接口的 API。流可以是可读的、可写的、或两者兼而有之。 所有的流都是 EventEmitter 的实例。
对于可写流来说,write(data)时,data只能是String或Buffer类型,_write(data)调用时传进来的data都是Buffer类型。 5. ...当内部可写缓冲器的总大小小于 highWaterMark 指定的阈值时, 调用 writable.write() 将返回true。...Duplex 和 Transform(可读写流)、pipe(管道) Duplex 创建可读可写流。 Duplex实际上就是继承了Readable和Writable的一类流。...通过该方法对数据进行加工。 读写流主要应用于Pipe管道,也是Stream最强大的功能。即数据加工、功能抽象、背压机制反馈。...当缓存清空时,就会触发drain事件。 // drain // 向可写流中写入数据一百万次。 // 需要注意背压 (back-pressure)。
创建可读流在Node.js中,我们可以通过创建一个可读流对象来读取数据。...创建可写流在Node.js中,我们可以通过创建一个可写流对象来写入数据到目标位置。...它同时实现了可读流和可写流的特性。可读写流在一些场景下非常有用,比如网络连接。创建可读写流在Node.js中,我们可以通过创建一个可读写流对象来实现读取和写入数据的双向流通。...;上述示例中,我们监听可读写流的data事件,当有新的数据块可用时,打印出该数据块的内容。然后,我们通过write方法向可读写流写入一段数据。...当数据通过转换流时,将会根据我们在transform方法中定义的转换逻辑进行处理。
可读流(Readable),可读取数据的流; 可写流(Writable),可写入数据的流; 双工流(Duplex),可读又可写的流; 转化流(Transform),在读写过程中可任意修改和转换数据的流(...也是可读写的流); 所有的流都可以通过 .pipe 也就是管道(类似于 linux 中的 |)来进行数据的消费。...另外,也可以通过事件来监听数据的流动。不管是文件的读写,还是 http 的请求、响应都会在内部自动创建 Stream,读取文件时,会创建一个可读流,输出文件时,会创建可写流。...可写流(Writable) 可写流对比起可读流,它是真的只能写,属于只进不出的类型,类似于貔貅。...下面看看 Node.js 中内部通过 fs 创建的可写流。
在本文中,我们将探讨Node.js中的流概念,了解可用的不同类型的流(可读流、可写流、双工流和转换流),并讨论有效处理流的最佳实践。 什么是Node.js流?...可读流以小块方式从文件中读取数据。 我们将事件处理程序附加到可读流上以处理不同的事件。当数据块可供读取时,会触发 data 事件。当可读流完成从文件中读取所有数据时,会触发 end 事件。...我们使用 this.push() 将数据推送到流中,当大小变为0时,通过将null推送到流中来表示读取结束。 在 _write() 方法中,我们实现了Duplex流的可写端。...我们从可读流开始,将其导入转换流,然后将转换流导入压缩流,最后将压缩流导入可写流。它允许您建立从可读流通过转换和压缩流到可写流的流畅数据流。...最后,事件处理程序被附加到可写流以处理 finish 和 error 事件。 使用 pipe() 简化了连接流的过程,自动处理数据流,并确保从可读流到可写流的高效和无误传输。
pipe VS pipeline pipe 创建一个可读流 readable 和一个可写流 writeable,通过管道 pipe 将可写流绑定到可读流,一个简单的 Stream 操作就完成了。...Linux 下一切皆文件,为了测试,在创建可读流时,你可以不创建 test1.txt 文件,让可读流自动触发 error 事件并且将 writeable 的 close 方法注释掉,通过 linux 命令...相比较于 pipe 方法增加了错误处理机制,当管道中的某个流发生错误,它会自动处理并释放掉相应的资源。.../file.js'); 并发模式 Stream 合并 流合并也是可以采用并发模式的,核心是通过可写流的 start、end 属性控制。...这样的规则,这种方式可以不用关注每一个流分块在文件中的存储顺序,也可以将可读流传输至可写流的指定位置。
例如,我们在 Linux 命令行中可以通过管道(pipe)来完成一些组合性的命令,在 Node.js 的流中也能实现。...上图列表中就是一些使用了流的原生 Node.js 对象。其中有一些对象甚至是既可读又可写的,例如 TCP socket、zlib 以及 crypto 等。...这就意味着如果我们有一个可以代表 big.file 的可读流,那么我们只需要将这两者管道(pipe)接起来就能得到几乎一样的效果,而且根本用不了那么多内存。...在可读流中,几个重要的事件分别是: data 事件,当流中传出一块数据给消费者的时候会触发这个事件; end 事件,当没有更多数据了的时候触发该事件; 在可写流中,几个重要的事件分别是: drain 事件...我们可以将可写流作为 pipe / unpipe 的参数传入,或者直接调用可写流的 write,当写入结束的时候可以调用 end 函数。
let w_flag = ws.write('aicoder.com 全栈实习 \r\n'); //当缓存区写满时,输出false console.log(w_flag); } ws.end...rs.pause(); } }); // 当可读流结束的时候,让可写流结束。...; }); // 可读流直接跟可写流建立管道。...可读流的数据 直接通过管道流向 可写流 rs.pipe(ws); /******************* |----------| |----------| |---rs ---|--------...' is: file' : ' is: dir'); }); }); }); 后续的学习 后续,可以实现一下自定义的可写流、可读流,多运用一些管道的方法,多看一下官方的文档,相信您已经可以掌握了文件模块相关的内容
流的历史演变 流不是 Node.js 特有的概念。它们是几十年前在 Unix 操作系统中引入的,程序可以通过管道运算符(|)对流进行相互交互。...,它们都是 Node.js 中 EventEmitter 的实例: 可读流(Readable Stream) 可写流(Writable Stream) 可读可写全双工流(Duplex Stream) 转换流...: true, // 流销毁时,是否发送close事件 autoDestroy: true, // 自动销毁,在'end'事件触发后被调用 destroyed: false, // 流是否已经被销毁...有数据流出时,就会触发可写流的写入事件,从而做到数据传递,实现像管道一样的操作。并且会自动将处于暂停模式的可读流变为流动模式。...流一共有四种类型:可读流、可写流、可读可写流、转换流,它们都继承了 EventEmiiter 的实例方法和静态方法,都是 EE 的实例 流的底层容器是基于 BufferList 的,这是一种自定义的链表实现
例如管道运算符 | 。 在 nodejs 中,实现各种功能,总避免不了和“数据”打交道,这些数据可能是 Buffer、字符串、数组等等。但当处理大量数据的时候,如何保证程序的稳健性?...stream 提供了 4 种基本的流类型: Writable:可写入数据流。 Readable:可读取数据流。 Duplex:双工流,可读又可写。...可读流和可写流都会在内部缓存器存储数据,Duplex 和 Transform 也在内部维护了缓存器。在开发者基于流开发时,可以通过传递highWaterMark参数,来修改默认缓冲的大小。...pipe 函数实现了以下几个功能: 不断从来源可读流中获得一个指定长度的数据。 将获取到的数据写入目标可写流。 平衡读取和写入速度,防止读取速度大大超过写入速度时,出现大量滞留数据。...参考连接 Nodejs 文档 数据流中的积压问题 通过源码解析 Node.js 中导流(pipe)的实现 Node.js Stream - 基础篇
这种分块处理的方式在处理大型数据集时尤为重要,因为它大大减少了内存的占用。(二)四种类型1. 可读流(Readable Streams)可读流是数据的来源,它能够提供数据给其他流或者消费者。...例如,从一个文件中读取数据时,文件就是一个可读流的源。可读流有两种模式:流动模式(flowing mode)和暂停模式(paused mode)。...双向流(Duplex Streams)双向流既可以是数据的来源也可以是数据的接收者,它在内部包含了一个可读流和一个可写流。...例如,一个网络连接的套接字就是一个双向流,数据可以通过这个套接字发送(可写)也可以接收(可读)。4. 转换流(Transform Streams)转换流在数据流动的过程中对数据进行转换。...例如,在前面提到的可读流和可写流的操作中,我们已经看到了如何监听error事件并进行相应的处理。在复杂的管道操作中,错误的传播也需要考虑到,以确保整个数据处理流程的健壮性。
Node.js,Stream有四种流类型: Readable-可读操作 Writable-可写操作 Duplex-可读可写操作 Transform-操作被写入数据,然后读出结果。...常用的事件有: data-当有数据可读时触发 end-没有更多的数据可读时触发 error-在接收和写入过程中发生错误时触发 finish-所有数据已被写入到底层系统时触发。...从流中读取数据 var fs = require("fs"); var data = ''; //创建可读流 var readerStream = fs.createReadStream('input.txt...readerSteam.pipe(writerStream); console.log("程序执行完毕"); 链式流 链式是通过连接输出流到另一个流并创建多个操作链的机制,链式流一般用于管道操作。...接下来我们就是用管道和链式来压缩和解压文件。
/big.file'); src.pipe(res); });server.listen(8000); 其中pipe方法把可读流的输出(数据源)作为可写流的输入(目标),直接把读文件的输出流作为输入连接到...从中可以消耗数据,如fs.createReadStream Writable 可写流是对可写入数据的目标的抽象,如fs.createWriteStream Duplex(双工) 双工流既可读又可写,如...TCP socket Transform(转换) 转换流本质上是双工流,用于在写入和读取数据时对其进行修改或转换,如zlib.createGzip用gzip压缩数据 转换流看一看做一个输入可写流,输出可读流的函数...P.S.有一种转换流叫(Pass)Through Stream(通过流),类似于FP中的identity = x => x 三.管道 src.pipe(res)要求源必须可读,目标必须可写,所以,如果是对双工流进行管道传输...事件,断流了,这是Writable stream可以接收更多数据的信号 finish事件,当所有数据都已flush到下层系统时触发 五.Readable stream的两种模式:Paused与Flowing
当这些操作之一完成时,内核会告诉 Node.js,以便可以将适当的回调添加到轮询队列中以最终执行。...当全部数据都生产出来后,必须调用push(null)来结束可读流。 流一旦结束,便不能再调用push(data)添加数据。 可以通过监听data事件的方式消耗可读流。...当数据全部被消耗时,会触发end事件。 上面的例子中,process.stdout代表标准输出流,实际是一个可写流。下小节中介绍可写流的用法。 Writable 创建可写流。...前面通过继承的方式去创建一类可读流,这种方法也适用于创建一类可写流,只是需要实现的是_write(data, enc, next)方法,而不是_read()方法。...Transform 在上面的例子中,可读流中的数据(0, 1)与可写流中的数据(’a’, ‘b’)是隔离开的,但在Transform中可写端写入的数据经变换后会自动添加到可读端。
领取专属 10元无门槛券
手把手带您无忧上云