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);
});
暂无评论,快来发表第一条评论吧~