当前位置: 首页 > article >正文

Node IO操作

文章目录

  • Node IO操作
    • 概述
    • 流的基本类型
    • 可读流
      • 读取模式
      • 可读流状态
      • 创建可读流
      • 使用可读流
      • 暂停和恢复
      • 绑定可写流
    • 可写流
      • 创建可写流
      • 使用可写流
      • 关闭流
      • 缓冲数据
    • 可读可写流
    • 转换流

Node IO操作

概述

在 Node.js 中,I/O(输入/输出)操作是异步的,这意味着它们不会阻塞主线程,允许其他代码继续执行。Node.js 提供了多种处理 I/O 操作的方式,包括文件系统操作、网络请求、数据库查询等。

Node.js 中的流是处理 I/O 操作的一种高效方式,特别是当处理大量数据时。流可以分为可读流、可写流、双工流和转换流。

流的基本类型

  • Readable:可读流
  • Writable:可写流
  • Duplex:双工流,可读可写流
  • Transform:转换流

可读流

读取模式

可读流有2种读取模式:

  • flowing:流动模式
  • paused:暂停模式

可读流状态

可读流有3种状态:

  • null:初始状态
  • true:流动状态
  • false:非流动状态

创建可读流

// 使用stream模块
const stream = require("stream");
const readable = new stream.Readable();// 使用fs模块
const fs = require("fs");
const read = fs.createReadStream("file.txt");

使用可读流

  • setEncoding():设置编码格式。
  • pause():暂停流。
  • resume():恢复流。
  • ispaused():是否暂停。
  • destroy():销毁流。
  • pipe():绑定可写流。
  • unpipe():解绑可写流。
  • on():监听事件
    • data:当流中有数据可读时触发。
    • end:当流中没有数据时触发。
    • error:当流发生错误时触发。
    • close:当流火底层资源关闭时触发。
const fs = require("fs");fs.createReadStream("file.txt").on("data", chunk => {console.log("读取数据:", chunk.toString());});

暂停和恢复

const fs = require("fs");const read = fs.createReadStream("file.txt");
read.setEncoding("utf8");
read.on("data", chunk => {console.log("读取数据:", chunk.toString());read.pause();setTimeout(() => {read.resume();}, 1000);
});
read.on("close", chunk => {console.log("读取完毕");
});

绑定可写流

const fs = require("fs");const read = fs.createReadStream("file.txt");
read.pipe(fs.createWriteStream("file2.txt"));

可写流

创建可写流

// 使用stream模块
const stream = require("stream");
const writable=new stream.Writable({write: function (chunk, encoding, next,) {console.log(chunk.toString());next();}}
);// 使用fs模块
const fs = require("fs");
const writable = fs.createWriteStream("file.txt");

使用可写流

  • wirte():写入数据。
  • end():关闭流。
  • destroy():销毁流。
  • cork():将数据缓冲到内存。
  • uncork():将内存的数据输出到目标处。
  • on():监听事件
    • finish:当所有数据已成功写入底层系统时触发。
    • drain:当流的缓冲区已清空,可以继续写入数据时触发。
    • error:当写入时发生错误触发。
    • close:当流关闭时触发。
const fs = require("fs");const writable = fs.createWriteStream("file.txt");
writable.write("Hello World");

关闭流

const fs = require("fs");const writable = fs.createWriteStream("file.txt");
writable.write("Hello World");
// 结束写入
writable.end("写入完毕");
writable.on("close", () => {console.log("写入结束");
});

缓冲数据

  • cork():调用该方法后,所有写入的数据会被缓冲到内存中。
  • uncork():调用该方法后,被缓冲的数据一次性写入底层系统。
const stream = require('stream');const writable = new stream.Writable({write: function (chunk, encoding, next) {console.log(chunk.toString());next();}
});
writable.write('Hello!');
writable.write('World!');
writable.cork();
writable.write('ABC');
writable.write('EFG');
setTimeout(() => {writable.uncork();
}, 2000);

可读可写流

可读可写流(双工流) Duplex 可以实现流的可读和可写功能,即同时实现 Readable 和 Writable。

要创建一个 Duplex 流,通常需要继承 stream.Duplex 类,并实现 _read 和 _write 方法。

const stream = require('stream');class MyDuplex extends stream.Duplex {constructor(options) {super(options);this.data = [];}// 从缓冲区读取数据_read = function (size) {const chunk = this.data.length > 0 ? this.data.shift() : null; // 从缓存读取数据this.push(chunk); // 触发data事件};// 将数据写入缓冲区_write = function (chunk, encoding, callback) {this.data.push(chunk); // 写入操作callback(); // 通知写入操作完成};
}const duplex = new MyDuplex();
// 监听data事件,负责接收数据
duplex.on('data', chunk => {console.log("读取数据:", chunk.toString());
});
// 监听end事件,读取完毕后调用
duplex.on('end', () => {console.log("读取完毕");
});
// 监听finish事件,写入完毕后调用
duplex.on('finish', () => {console.log("写入完毕");
});
duplex.write("hello");
duplex.write("world");
duplex.end(); // 结束写入操作// 读取数据: hello
// 读取数据: world
// 写入完毕
// 读取完毕

转换流

Transform 流是 Node.js 中的一种特殊类型的 Duplex 流,它用于在数据流经时对数据进行转换。Transform 流继承自 Duplex 流,但它专门用于处理数据的转换操作,例如加密、压缩、数据格式转换等。

const stream = require('stream');class MyTransform extends stream.Transform {constructor(options) {super(options);}// 数据转换操作_transform(chunk, encoding, callback) {const result = chunk.toString().toUpperCase();this.push(result);callback();}
}const transform = new MyTransform();
transform.on("data", (chunk) => {console.log("接收数据", chunk.toString());
});
transform.write("hello");
transform.write("world");
transform.end();// 接收数据 HELLO
// 接收数据 WORLD

相关文章:

Node IO操作

文章目录 Node IO操作概述流的基本类型可读流读取模式可读流状态创建可读流使用可读流暂停和恢复绑定可写流 可写流创建可写流使用可写流关闭流缓冲数据 可读可写流转换流 Node IO操作 概述 在 Node.js 中,I/O(输入/输出)操作是异步的&…...

零基础进阶人工智能——发展史、核心技术、前沿应用与未来展望

引言:从科幻走向现实,人工智能不再遥远 人工智能(AI),曾经是科幻小说和电影中遥不可及的未来科技,如今已悄然渗透到我们生活的方方面面。从智能家居的语音助手,到医疗诊断的辅助系统&#xff0…...

ue----git局域网内部署裸仓库,别的机器进行访问

最近由于经常迁移项目到另一台机器上进行部署更新一点就要整个迁移 弄得麻烦了 就在网上学了一下这个方式 首先我们在想要建立裸仓库的电脑上找到一个文件夹放置我们的裸仓库 在此点击鼠标右键选择 open git bash here 输入命令 创裸仓库 git init --bare gitTestName.git…...

三、tsp学习笔记——屏幕移植

泰山派-6寸猫屏转接板 - 立创开源硬件平台 泰山派樱猫的教程,屏资料链接: https://pan.baidu.com/s/1pNAKH33r7LtZG6EwHJ-HNA?pwdnsde 提取码: nsde (不要浪费时间下载,没有用,下载gitee上的) leefei/tspi-disp-6…...

vue3-05reactive定义对象类型的响应式数据(不能进行基本类型数据的响应式)

1.前言 reactive定义对象类型的响应式数据(不能进行基本类型数据的响应式) 2.实践 2.1语法 const 代理对象 reactive(源对象) 接收一个对象(或数组)&#xff0c;返回一个代理对象 (Proxy的实例对象&#xff0c;简称proxy对象) <script> import { reactive } from &qu…...

PaddlePaddle的OCR模型转onnx-转rknn模型_笔记4

一、PaddlePaddle的OCR模型转onnx 1、首先建立一个新的虚拟环境 conda create -n ppocr python3.10 -y conda activate ppocr 2、进入paddlepaddle官网输入以下指令安装paddlepaddle GPU版本 &#xff08;我的cuda版本是11.8,根据你电脑装合适版本&#xff09; pip instal…...

DeepSeek与ChatGPT的对比分析

一 概述 1 DeepSeek DeepSeek是杭州深度求索&#xff08;DeepSeek&#xff09;官方推出的AI助手&#xff0c;免费体验与全球领先AI模型的互动交流。总参数达到6710亿的DeepSeek-V3大模型&#xff0c;多项性能指标对齐海外顶尖模型&#xff0c;用更快的速度、更加全面强…...

OpenAI Swarm 多智能体框架介绍

目录 一、什么是 Swarm &#xff1f; 二、Swarn 使用方法 2.1 安装依赖 2.2 实例 本篇文章主要介绍下 OpenAI Swarm 多智能体框架。 一、什么是 Swarm &#xff1f; Swarm 是 OpenAI 开源的一款多智能体框架&#xff0c;但 OpenAI 对 Swarm 的定位是教育性、实验性的框架&…...

华大MCU HC32F005端口GPIO控制失效问题

1. 问题来源&#xff1a;RS485通信时&#xff0c;且数据量大、持续运行一段时间后&#xff0c;发现RS485使能引脚没有得到释放&#xff0c;导致总线锁死&#xff0c;无法通信&#xff0c;影响到整个总线的设备。 2. 问题分析&#xff1a;1&#xff09;经过测试和跟踪&#xff…...

Android今日头条的屏幕适配方案

今日头条的屏幕适配方案是一种基于动态调整设备密度&#xff08;density&#xff09;的适配方法&#xff0c;其核心原理是通过修改系统默认的屏幕密度参数&#xff0c;使得不同分辨率和尺寸的设备能够按照设计图的尺寸比例显示界面元素。以下是其核心原理与实现细节的总结&…...

抓包工具是什么?

抓包工具是一种用于捕获和分析网络数据包的软件或硬件设备。它可以帮助用户监控网络通信过程&#xff0c;查看网络中传输的数据内容、协议类型、源地址、目的地址等信息。以下是关于抓包工具的一些详细解释&#xff1a; 1. 主要功能 捕获数据包&#xff1a;抓包工具能够实时捕…...

微信小程序消息推送解密

package com.test.main.b2b;import org.apache.commons.codec.binary.Base64;import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.util.Arrays;/*** author * version 1.0* description: 解谜微信小…...

【大模型系列篇】DeepSeek-R1如何通过强化学习有效提升大型语言模型的推理能力?

如何通过强化学习&#xff08;RL&#xff09;有效提升大型语言模型&#xff08;LLM&#xff09;的推理能力&#xff1f; 《DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning》由DeepSeek-AI团队撰写&#xff0c;主要介绍了他们开发的第一代…...

企业存储系统

一、概述 数字经济 人类通过大数据&#xff08;数字化的知识与信息&#xff09;的识别—选择—过滤—存储—使用&#xff0c;引导、实现资源的快速优化配置与再生&#xff0c;实现经济高质量发展的经济形态。 产业互联网推动发展 企业开始进行数字化转型&#xff0c;将传统…...

数据结构系列一:初识集合框架+复杂度

前言 数据结构——是相互之间存在一种或多种特定关系的数据元素的集合。数据结构是计算机专业的基础课程&#xff0c;但也是一门不太容易学好的课&#xff0c;它当中有很多费脑子的东西&#xff0c;之后在学习时&#xff0c;你若碰到了困惑或不解的地方 都是很正常的反应&…...

【AI】GitHub Copilot

GitHub Copilot 是一款由 GitHub 和 OpenAI 合作开发的 AI 编程助手&#xff0c;它可以在多种开发工具中使用。以下是 GitHub Copilot 支持的主要开发工具和平台&#xff1a; 1. Visual Studio Code (VS Code) 官方支持&#xff1a;GitHub Copilot 在 VS Code 中拥有最完整的集…...

Linux系统编程学习 NO.14——缓冲区的概念、模拟实现Cstdio库

用户缓冲区 先介绍一下关于用户缓冲区的周边知识。 fread和fwrite的返回值 谈一谈fread和fwrite的返回值&#xff0c;如果写入/读取文件成功&#xff0c;fread或fwrite的返回值指的是实际写入/读取的内存块数量(实际的nmemb的大小)。假如fwrite写入的size是5字节&#xff0c;…...

Linux性能监控工具汇总

文章目录 前言一、性能监控工具介绍1.概念介绍2.常用组合方式3.对比 二、sar工具1.sar安装2.sar工具参数3.sar工具使用示例3.1.每两秒采集一次cpu使用情况&#xff0c;总计采集2次,然后输出CPU使用情况的统计信息3.2.磁盘IO使用情况统计3.3.内存使用情况统计3.4.网卡流量使用情…...

某手sig3-ios算法 Chomper黑盒调用

Chomper-iOS界的Unidbg 最近在学习中发现一个Chomper框架&#xff0c;Chomper 是一个模拟执行iOS可执行文件的框架&#xff0c;类似于安卓端大名鼎鼎的Unidbg。 这篇文章使用Chomper模拟执行某手的sig3算法&#xff0c;初步熟悉该框架。这里只熟悉模拟执行步骤以及一些常见的…...

MySQL版本选择与安装

MySQL版本选择与安装 MySQL 5.5 优点: 稳定性&#xff1a;5.5版本是长期支持&#xff08;LTS&#xff09;版本&#xff0c;因此它非常稳定&#xff0c;被广泛部署在生产环境中。 兼容性&#xff1a;与旧版本的MySQL和各种应用程序有很好的兼容性。 缺点: 过时&#xff1a;…...

【飞行器原理学习】——1. 机翼及机翼参数

飞行器原理学习——1.机翼 一、 概述 飞机的各种机翼是飞机的控制面 通过铰链、钢索、液压等方式连接在机身上 操纵面运动时&#xff0c;会改变机翼的弧度和形状&#xff0c;使流经的空气发生偏转&#xff0c;从而影响空气动力的大小。使飞机围绕着3轴运动 二、机翼的操纵面…...

TS语言自定义脚手架

初始化 新建文件夹初始化命令 npm init -ytsc --initnpm i types/nodenpm i typescript# 处理别名npm i -D tsc-alias -y 表示选项都为yes 安装ts相关依赖 新建相关文件 bin 文件夹 src文件夹 commands 文件夹 &#xff08;命令 utils 文件夹 (封装方法&#xff09; index.t…...

lab4 CSAPP:Cachelab

写在前面 最简单的一集 实验室分为两个部分。在A部分中&#xff0c;实现一个缓存模拟器。在B部分中&#xff0c;编写一个矩阵针对高速缓存性能优化的转置功能。 感觉是比较经典的问题&#xff0c;之前在体系结构的课程中接触过&#xff0c;终于能通过lab实操一下了。 实验目…...

VScode C语言学习开发环境;运行提示“#Include错误,无法打开源文件stdio.h”

C/C环境配置 参考&#xff1a; VS Code 配置 C/C 编程运行环境&#xff08;保姆级教程&#xff09;_vscode配置c环境-CSDN博客 基本步骤 - 安装MinGW-W64&#xff0c;其包含 GCC 编译器&#xff1a;bin目录添加到环境变量&#xff1b;CMD 中输入gcc --version或where gcc验证…...

雷龙CS SD NAND(贴片式TF卡)测评体验

声明&#xff1a;非广告&#xff0c;为用户体验文章 前段时间偶然获得了雷龙出品的贴片式 TF 卡芯片及转接板&#xff0c;到手的是两片贴片式 nand 芯片搭配一个转接板&#xff0c;其中有一片官方已经焊接好了&#xff0c;从外观来看&#xff0c;正面和背面设计布局合理&#x…...

伯克利 CS61A 课堂笔记 11 —— Mutability

本系列为加州伯克利大学著名 Python 基础课程 CS61A 的课堂笔记整理&#xff0c;全英文内容&#xff0c;文末附词汇解释。 目录 01 Objects 02 Example: Strings Ⅰ Representing Strings: the ASCII Standard Ⅱ Representing Strings: the Unicode Standard 03 Mutatio…...

从零开始构建一个小型字符级语言模型的详细教程(基于Transformer架构)之一数据准备

最近特别火的DeepSeek,是一个大语言模型,那一个模型是如何构建起来的呢?DeepSeek基于Transformer架构,接下来我们也从零开始构建一个基于Transformer架构的小型语言模型,并说明构建的详细步骤及内部组件说明。我们以构建一个字符级语言模型(Char-Level LM)为例,目标是通…...

云原生DevOps:Zadig架构设计与企业实践分析

在云原生时代&#xff0c;随着微服务架构和容器技术的广泛应用&#xff0c;软件交付模式正经历着深刻的变革。DevOps作为一种文化、运动和实践&#xff0c;正逐渐成为企业快速交付高质量软件的关键。本文将探讨在云原生背景下&#xff0c;DevOps工程架构的设计与实践&#xff0…...

UMLS数据下载及访问

UMLS数据申请 这个直接在官网上申请即可&#xff0c;记得把地址填全&#xff0c;基本都会拿到lisence。 UMLS数据访问 UMLS的数据访问分为网页访问&#xff0c;API访问以及数据下载后的本地访问&#xff0c;网页访问&#xff0c;API访问按照官网的指示即可&#xff0c;这里主…...

DEX-EE三指灵巧手:扩展AI与机器人研究的边界

DEX-EE三指灵巧手&#xff0c;由Shadow Robot与Google DeepMind合作开发&#xff0c;以其先进技术和设计&#xff0c;正在引领AI与机器人研究的新趋势。其高精度传感器和灵活的机械手指&#xff0c;能够捕捉复杂的环境数据&#xff0c;为强化学习实验提供了可靠支持。 Shadow R…...