【Node.js入门笔记6---fs流(Streams)与管道(Pipe)】

server/2025/3/18 20:18:59/

Node.js入门笔记6

  • Node.js---fs 流(Streams)与管道(Pipe)
  • 一、流(Streams)与管道(Pipe)
    • 1.fs.createReadStream():创建可读流,逐块读取文件。逐块读取文件内容,适用于大文件或需要实时处理的场景(如视频流、日志分析)。
    • 2. fs.createWriteStream():创建可写流,逐块写入文件。逐块写入文件内容,适用于逐步生成或接收数据的场景(如下载文件、日志记录)
    • 3.pipe() 将可读流直接传输到可写流。

Node.js—fs 流(Streams)与管道(Pipe)

一、流(Streams)与管道(Pipe)

1.fs.createReadStream():创建可读流,逐块读取文件。逐块读取文件内容,适用于大文件或需要实时处理的场景(如视频流、日志分析)。

语法格式:

const readStream = fs.createReadStream(path, {// 可选参数flags: 'r',         // 文件打开模式encoding: null,     // 编码格式(默认 Buffer)fd: null,           // 文件描述符(如果提供,则忽略 path)mode: 0o666,        // 文件权限(默认 0o666)autoClose: true,    // 是否自动关闭文件描述符emitClose: true,    // 是否触发 'close' 事件start: 0,           // 读取起始位置(字节)end: Infinity,      // 读取结束位置(字节)highWaterMark: 64 * 1024 // 每次读取的缓冲区大小(字节)});

参数解读:
path: 必选参数,文件路径
options: 可选参数,可指定编码格式、文件打开模式等


const fs = require('fs');// 读取文件的中间部分(字节 100 到 200)
const readStream = fs.createReadStream('data.bin', {encoding: 'utf8',  // 指定文本编码start: 100,        // 从第 100 字节开始end: 200,          // 到第 200 字节结束highWaterMark: 1024 // 每次读取 1KB
});readStream.on('data', (chunk) => {console.log('收到数据块:', chunk);
});

写完代码后,需要在terminal控制台输入指令:node 【 js文件的路径】

node C:\Users\Administrator\Desktop\learning\createReadStream.js

2. fs.createWriteStream():创建可写流,逐块写入文件。逐块写入文件内容,适用于逐步生成或接收数据的场景(如下载文件、日志记录)

语法格式

const writeStream = fs.createWriteStream(path, {// 可选参数flags: 'w',         // 文件打开模式encoding: 'utf8',   // 编码格式(默认 utf8)fd: null,           // 文件描述符(如果提供,则忽略 path)mode: 0o666,        // 文件权限(默认 0o666)autoClose: true,    // 是否自动关闭文件描述符emitClose: true,    // 是否触发 'close' 事件start: 0            // 写入起始位置(字节)
});

参数解读:
path: 必选参数,文件路径
options: 可选参数,可指定编码格式、文件打开模式等

const fs = require('fs');// 以追加模式写入日志
const writeStream = fs.createWriteStream('app.log', {flags: 'a',        // 追加模式(不覆盖原有内容)encoding: 'utf8',  // 文本编码
});writeStream.write('用户登录\n');
writeStream.write('操作记录\n');
writeStream.end('日志结束\n'); // 结束写入

写完代码后,需要在terminal控制台输入指令:node 【 js文件的路径】

node C:\Users\Administrator\Desktop\access.js

3.pipe() 将可读流直接传输到可写流。

特点
1.自动处理数据流动。
2.自动控制背压(Backpressure,即读写速度不一致的问题)。
3.错误不会自动传递,需手动监听错误事件。

核心原理

1.数据流动:
当可读流有数据时,自动触发 data 事件,将数据块(chunk)写入可写流。
当可写流的缓冲区满时,暂停可读流(调用 readableStream.pause())。
当可写流缓冲区清空时,恢复可读流(调用 readableStream.resume())。

2.背压控制:
如果可写流处理速度 < 可读流生产速度,pipe() 会自动暂停可读流,避免内存溢出。
语法格式:

readableStream.pipe(writableStream[, options]);

参数解读:
writableStream :默认情况下自动调用 writableStream.end(),但可以通过将 end 选项设置为 false 来禁用此行为。
options :是一个可选的对象,可以包含 end 和其他选项。

默认行为

// 1.导入fs模块
const fs = require('fs');// 创建可读流和可写流
const readStream = fs.createReadStream('input.txt');
const writeStream = fs.createWriteStream('output.txt');// 传输数据,自动结束可写流
readStream.pipe(writeStream);
// 等同于 readStream.pipe(writeStream, { end: true });writeStream.on('finish', () => {console.log('数据写入完成,可写流已自动关闭!');
});

写完代码后,需要在terminal控制台输入指令:node 【 js文件的路径】

node C:\Users\Administrator\Desktop\learning\pipe.js

手动结束可写流

const fs = require('fs');const writeStream = fs.createWriteStream('combined.log');// 第一个可读流写入
fs.createReadStream('log1.txt').pipe(writeStream, { end: false }) // 不自动结束.on('end', () => {// 继续追加第二个可读流fs.createReadStream('log2.txt').pipe(writeStream, { end: false }).on('end', () => {// 手动结束可写流writeStream.end('--- 日志合并完成 ---\n');});});

写完代码后,需要在terminal控制台输入指令:node 【 js文件的路径】

node C:\Users\Administrator\Desktop\learning\pipe.js

http://www.ppmy.cn/server/176042.html

相关文章

四道Dockerfile练习

一、编写Dockerfile&#xff0c;ubuntu_18.04:v3 要求&#xff1a; 1、基础镜像ubuntu:18.04。 2、替换为国内的安装源&#xff08;比如阿里或163&#xff09;。 3、安装openssh-server。 4、允许root用户远程登录。 5、暴露端口22。 6、服务开机自启…

c++图论(二)之图的存储图解

在 C 中实现图的存储时&#xff0c;常用的方法包括 邻接矩阵&#xff08;Adjacency Matrix&#xff09;、邻接表&#xff08;Adjacency List&#xff09; 和 边列表&#xff08;Edge List&#xff09;。以下是具体实现方法、优缺点分析及代码示例&#xff1a; 1. 邻接矩阵&…

双 Token 无感刷新机制在前后端分离架构中实现

在前后端分离的架构中&#xff0c;双 Token 无感刷新是一种常见的身份验证机制&#xff0c;用于在 Access Token 过期时&#xff0c;通过 Refresh Token 自动获取新的 Access Token&#xff0c;从而避免用户频繁登录。 1. 双 Token 无感刷新的核心流程 1.1 核心流程 用户登录&…

ElementUI 表格中插入图片缩略图,鼠标悬停显示大图

如何在 ElementUI 的表格组件 Table 中插入图片缩略图&#xff0c;通过鼠标悬停显示大图&#xff1f;介绍以下2种方式&#xff1a; 方法1&#xff1a;直接在模板元素中插入 <template><el-table :data"tableData"><el-table-column label"图片…

conda创建Python虚拟环境的原理

<Conda>在创建Python虚拟环境时&#xff0c;其背后的原理涉及到Conda包的版本管理和隔离。Conda是一个开源的包管理器和环境管理系统&#xff0c;它主要用于安装、运行和部署各种Python、R、Ruby、Node.js等语言的包、依赖和库。以下是创建Python虚拟环境的原理&#xff…

使用 Docker 部署前端项目全攻略

文章目录 1. Docker 基础概念1.1 核心组件1.2 Docker 工作流程 2. 环境准备2.1 安装 Docker2.2 验证安装 3. 项目配置3.1 项目结构3.2 创建 Dockerfile 4. 构建与运行4.1 构建镜像4.2 运行容器4.3 访问应用 5. 使用 Docker Compose5.1 创建 docker-compose.yml5.2 启动服务5.3 …

电脑如何录屏

以下是电脑录屏的常用方法总结&#xff0c;涵盖系统自带工具、第三方软件及进阶功能&#xff0c;结合不同场景需求推荐最佳方案&#xff1a; 一、系统自带工具 Xbox Game Bar&#xff08;Windows 10/11&#xff09; 操作步骤&#xff1a;按 WinG 打开游戏栏 → 点击录制按钮&am…

JVM调优关注的核心指标?

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…