node的stream

文章类型:node

发布者:hp

发布时间:2026-04-26

一:是什么

1:Node.js 中的流(Stream)是一种处理数据的方式,它允许你以流的方式处理数据,而不是一次性加载整个数据集。

二:类型

‌1:Readable (可读流)‌ 数据的源头,用于从中读取数据。 如fs.createReadStream、HTTP 请求的 request 对象。

‌2:Writable (可写流)‌ 数据的目的地,用于向其中写入数据。 如fs.createWriteStream、HTTP 响应的 response 对象。

‌3:Duplex (双工流)‌ 既可读又可写,同时具备上述两种能力。 如TCP 套接字 (net.Socket)。

‌4:Transform (转换流)‌ 一种特殊的双工流,在读写过程中可以修改或转换数据。压缩、加密等操作常用此类型。

三:优势

1:内存效率‌:不需要将大量数据一次性加载到内存中,适合处理大于可用内存的大文件。

‌2:时间效率‌:可以在数据传输过程中立即开始处理数据,无需等待所有数据就绪,实现了“边接收边处理”。

‌3:可组合性‌: 多个流可以像管道一样连接起来,形成数据处理流水线。

四:方法

data‌:当有数据块可读时触发。注意,数据是分块到达的,该事件可能触发多次。

‌end‌:当没有更多数据可读时触发,标志着读取结束。

‌error‌:在接收或写入过程中发生错误时触发。

‌finish‌:当所有数据已写入到底层系统时触发(仅针对可写流)

五:示例

const fs = require('fs');

// 创建可读流
const readerStream = fs.createReadStream('input.txt', { encoding: 'UTF8' });

let data = '';

// 监听 data 事件,逐块接收数据
readerStream.on('data', function(chunk) {
    data += chunk;
});

// 监听 end 事件,数据读取完毕
readerStream.on('end', function() {
    console.log('完整数据:', data);
});

// 监听 error 事件
readerStream.on('error', function(err) {
    console.log('错误信息:', err.stack);
});

六:应用场景

大文件处理‌:如视频上传/下载、日志文件分析,避免内存溢出。

‌网络通信‌:HTTP 服务器中,request 和 response 都是流,允许实时处理客户端请求和发送响应。

‌数据压缩与加密‌:使用 zlib 模块创建的转换流可以实时压缩或解压数据。

‌命令行工具‌:类似 Unix 管道的操作,如 ls | grep node,在 Node.js 中可以通过 process.stdin 和 process.stdout 实现。

七:补充

管道流(Pipeline Stream)是一种特殊的流操作,它通过将多个流连接在一起,实现数据的连续处理和传输。

可以通过将多个流连接在一起,形成一个管道流,以便将数据从一个流中传递到另一个流中。 例如将可读流、转换流和可写流连接起来,形成一个管道流:

const fs = require('fs');

// 创建读取流和写入流
const readStream = fs.createReadStream('source.txt');
const writeStream = fs.createWriteStream('target.txt');

// 使用 pipe 连接流
readStream.pipe(writeStream);

// 监听写入完成
writeStream.on('finish', () => {
    console.log('文件复制完成');
});

// 监听错误
readStream.on('error', (err) => {
    console.error('读取错误:', err);
});
writeStream.on('error', (err) => {
    console.error('写入错误:', err);
});


评论
0条评论遵守法律,文明用语,共同建设文明评论区

暂无评论,快来发表第一条评论吧~