node.js基础学习-fs模块-Stream流(七)

一、前言

在 Node.js 的fs(文件系统)模块中,流(Stream)是一种处理数据的高效方式。它允许以连续的方式读取或写入数据,而不必将整个文件的内容一次性加载到内存中。这对于处理大型文件特别有用,因为它可以避免内存溢出问题,并且在数据处理过程中可以更早地开始处理部分数据,而不必等待整个文件读取完成。

二、可读流(Readable Stream)

创建可读流:

可以使用fs.createReadStream()方法来创建一个可读流。例如,要读取一个文本文件,可以这样做:

js 复制代码
const fs = require('fs');
const readableStream = fs.createReadStream('example.txt');

这个方法接受一些参数,如文件名、文件编码(默认是null,会以二进制模式读取)、可选的开始位置和结束位置(用于读取文件的特定部分)等。

事件和数据读取:

可读流会触发data事件,当有数据块从流中读取出来时,就会触发这个事件。例如:

js 复制代码
const fs = require('fs');
const readableStream = fs.createReadStream('example.txt');
readableStream.on('data', (chunk) => {
    console.log('Received a data chunk:', chunk.toString());
});

这里将读取到的数据块(chunk)转换为字符串进行打印。可读流还会触发end事件,当文件读取完毕时会触发该事件,error事件则在读取过程中出现错误时触发。

暂停和恢复读取:

可读流可以通过pause()方法暂停读取数据,通过resume()方法恢复读取。例如:

js 复制代码
const fs = require('fs');
const readableStream = fs.createReadStream('example.txt');
let paused = false;
readableStream.on('data', (chunk) => {
    if (!paused) {
        console.log('Received a data chunk:', chunk.toString());
    }
    if (someCondition) {
        paused = true;
        readableStream.pause();
    }
});
setTimeout(() => {
    paused = false;
    readableStream.resume();
}, 5000);

三、可写流(Writable Stream)

创建可写流:

使用fs.createWriteStream()方法创建可写流。例如,要写入一个新的文本文件,可以这样操作:

js 复制代码
const fs = require('fs');
const writableStream = fs.createWriteStream('newFile.txt');

它同样接受一些参数,如文件名、文件编码(默认是utf8)等。

写入数据:

可以通过write()方法向可写流中写入数据。例如:

js 复制代码
const fs = require('fs');
const writableStream = fs.createWriteStream('newFile.txt');
const data = 'This is some data to write';
writableStream.write(data);
writableStream.end();

注意在写入数据后,通常需要调用end()方法来表示数据写入结束。如果不调用end(),可能会导致数据没有完全写入文件。可写流会触发finish事件,当所有数据都已成功写入并且流已经结束时会触发该事件,error事件在写入过程中出现错误时触发。

四、管道(Pipe)操作

管道操作是一种非常方便的将可读流和可写流连接起来的方式。例如,可以将一个文件读取流直接管道到一个文件写入流,从而实现文件的复制:

js 复制代码
const fs = require('fs');
const readableStream = fs.createReadStream('sourceFile.txt');
const writableStream = fs.createWriteStream('destinationFile.txt');
readableStream.pipe(writableStream);

管道操作内部会自动处理数据的读取、写入以及流的各种事件(如dataend等),使得代码更加简洁和高效。同时,还可以在管道中间插入其他的转换流(如zlib模块中的压缩流或解压缩流)来对数据进行处理。

相关推荐
Shadow(⊙o⊙)3 分钟前
硬核手搓解析!进程-内核分析:命令行参数及环境变量,重构main()
linux·运维·服务器·开发语言·c++·后端·学习
星夜夏空993 分钟前
STM32单片机学习(11)——GPIO输入实验
stm32·单片机·学习
开开心心就好9 分钟前
支持添加网址的资源快速打开工具
人工智能·学习·游戏·音视频·hbase·语音识别·storm
sheeta199813 分钟前
TypeScript 学习笔记
笔记·学习·typescript
Honker_yhw21 分钟前
大数据管理与应用系列丛书《数据挖掘》(吕欣等著)读书笔记-数据预处理
笔记·学习
sakiko_22 分钟前
Swift学习笔记26-使用第三方库
笔记·学习·swift
Purple Coder9 小时前
BMS学习经验
学习
经济元宇宙9 小时前
摄影培训行业百科:机构选择与学习路径全解析
大数据·人工智能·学习
晓杰'9 小时前
从0到1实现 Balatro 游戏后端(2):NestJS框架搭建与项目结构设计
后端·websocket·typescript·node.js·游戏开发·项目实战·nestjs
じ☆冷颜〃10 小时前
实分析与测度论、复分析、傅里叶分析、泛函分析、凸分析概述.
笔记·学习·数学建模·拓扑学·傅立叶分析