Nodejs实现读写文件和文件流

Nodejs中,文件操作是非常常见的任务之一。它允许我们读取和写入文件,以及处理大型文件而不会消耗太多内存。本篇博文将会首先介绍一下文件和文件流的区别,然后全面介绍如何在Nodejs中实现文件操作和读写,包括使用文件系统模块(fs)和文件流(streams)

在讨论如何读取文件和文件流之前,我们先讨论一下文件和文件流的区别。

公众号:Code程序人生,个人网站:https://creatorblog.cn

文件和文件流的区别

文件

一个文件是一组有序的字节数据,存储在存储介质(如硬盘、SSD等)上,每个文件都有一个唯一的文件名和路径。文件可以是文本文件、图像文件、音频文件、视频文件等。

文件的读写操作通常涉及将整个文件的内容一次性加载到内存中,然后进行操作。在文件操作期间,可能会将整个文件加载到内存中,因此处理大型文件可能会导致内存消耗过高。

文件流

文件流是一种逐块处理文件数据的方式,它允许我们按块(或一小部分一小部分)读取或写入文件数据,而不需要将整个文件加载到内存中。这对于处理大型文件或需要逐步处理数据的情况非常有用,因为它能够降低内存消耗并提高性能。

文件流将文件数据分为多个数据块(或缓冲区),并以逐块的方式进行读取或写入。这种流式处理的方式使得可以在不等待整个文件读取或写入完成的情况下,逐步处理文件数据。

读写文件

读取

Nodejs中,可以使用文件系统模块(fs)来读取文件。最常见的方式是通过fs.readFile()方法实现异步读取文件内容,fs也提供了同步读取文件的方法fs.readFileSync(),大家可以根据实际业务来自行使用对应的方法。

// example.txt
我是文件内容我是文件内容我是文件内容我是文件内容我是文件内容我是文件内容// file.js
const fs = require('fs');fs.readFile('example.txt', 'utf8', (err, data) => {if (err) {console.error('读取文件失败:', err);return;}console.log('文件内容:', data);
});

在上面的代码中,我们使用fs.readFile()方法异步地读取名为example.txt的文件。'utf8'参数指定编码格式,以便正确解析文本文件。

运行代码后,结果如下:

image.png

写入

要写入文件,我们可以使用fs.writeFile()方法。该方法用于异步地将数据写入文件。fs同样提供同步写入文件的方法fs.writeFileSync()。如果文件不存在,则会创建一个新文件;如果文件已经存在,则会覆盖其内容。

// file.js
const fs = require('fs');const fileContent = '这是我准备写入的文件内容';fs.writeFile('output.txt', fileContent, 'utf8', (err) => {if (err) {console.error('写入文件失败:', err);return;}console.log('写入文件成功!');
});

在上面的代码中,我们使用fs.writeFile()方法异步地将fileContent的内容写入名为output.txt的文件。

运行代码后,结果如下:

image.png

image.png

读写文件流

文件流是Nodejs中处理大型文件的一种有效方式。它们允许我们在读取或写入文件时,分块处理数据,避免将整个文件加载到内存中。

Nodejs中,对于流式读取和写入文件,通常只提供异步的方法,而没有同步的方法。这是因为流操作通常涉及大量的数据处理,如果使用同步的方式,可能会阻塞主线程,导致应用性能下降。

读取

使用文件流进行文件读取的一种方法是使用fs.createReadStream()方法。这允许我们逐块读取文件数据。

// file.js
const fs = require('fs');const readStream = fs.createReadStream('largefile.txt', 'utf8');readStream.on('data', (chunk) => {console.log('接收到一块数据:', chunk);
});readStream.on('end', () => {console.log('文件读取完成.');
});readStream.on('error', (err) => {console.error('文件读取失败:', err);
});

largefile.txt文件内容如下:

image.png

在上面的代码中,我们使用fs.createReadStream()方法创建一个文件读取流,然后监听'data'事件来处理每个数据块,'end'事件表示文件读取结束,'error'事件处理可能出现的错误。

运行代码后,结果如下:

image.png

写入

类似地,可以使用fs.createWriteStream()方法创建文件写入流,将数据分块写入文件。

// file.js
const fs = require('fs');const writeStream = fs.createWriteStream('output_large.txt', 'utf8');writeStream.write('文件块1 1 ');
writeStream.write('文件块2 2 ');
writeStream.write('文件块3 3 ');writeStream.end();writeStream.on('finish', () => {console.log('写入文件结束.');
});writeStream.on('error', (err) => {console.error('写入文件异常:', err);
});

在上面的代码中,我们使用fs.createWriteStream()方法创建一个文件写入流,并使用write()方法写入文件的不同数据块,最后通过调用end()方法来完成写入操作。'finish'事件表示文件写入完成,'error'事件处理可能出现的错误。

运行代码后,结果如下:

image.png

image.png

总结

本文全面介绍了如何在Nodejs中实现文件操作和读写,包括使用文件系统模块和文件流。文件操作是Nodejs中常见且重要的任务,希望本文提供的代码示例和解释能够帮助读者深入了解如何在Nodejs中处理文件操作,同时避免一些常见的错误。使用文件流可以有效地处理大型文件,避免内存溢出等问题,因此在处理大文件时,推荐使用文件流的方式。

记得在使用文件操作时,要考虑异常处理和错误处理,确保代码的健壮性和可靠性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/77495.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vxworks文件系统分析

参考https://www.freebuf.com/articles/endpoint/335030.html 测试固件 https://service.tp-link.com.cn/detail_download_7989.html 固件提取 binwalk解压固件,在第一部分即为要分析的二进制文件,可以拖进ida分析 设置为arm小端字节序,点…

IL汇编语言读取控制台输入和转换为整数

新建一个testcvt.il; .assembly extern mscorlib {}.assembly Test{.ver 1:0:1:0}.module test.exe.method static void main() cil managed{.maxstack 1.entrypointldstr "\n请输入一个数字:"call void [mscorlib]System.Console::Write(string)call st…

目标检测中的IOU

IOU 什么是IOU?IOU应用场景写代码调试什么是IOU? 简单来说IOU就是用来度量目标检测中预测框与真实框的重叠程度。在图像分类中,有一个明确的指标准确率来衡量模型分类模型的好坏。其公式为: 这个公式显然不适合在在目标检测中使用。我们知道目标检测中都是用一个矩形框住…

npm更新和管理已发布的包

目录 1、更改包的可见性 1.1 将公共包设为私有 ​编辑 使用网站 使用命令行 1.2 将私有包公开 使用网站 使用命令行 2、将协作者添加到用户帐户拥有的私有包 2.1 授予对Web上私有用户包的访问权限 2.2 从命令行界面授予私有包访问权限 2.3 授予对私有组织包的访问权限…

Python导出SqlServerl数据字典为excel

sql代码 SELECTtableName D.name ,tableIntroduce isnull(F.value, ),sort A.colorder,fieldName A.name,catogary B.name,bytes A.Length,lengths COLUMNPROPERTY(A.id, A.name, PRECISION),scales isnull(COLUMNPROPERTY(A.id, A.name, Scale), 0),isOrNotNull Cas…

Linux新手小程序——进度条

前言 目录 前言 需要先了解 1.\r和\n 2.缓冲区 一.理解字符的含义: 学习c语言时,我们可以粗略把字符分为可显字符和控制字符. 在按回车换到下一行开始的操作时,实际上是进行了两个操作:1.让光标跳到下一行(只…

【css问题】flex布局中,子标签宽度超出父标签宽度,导致布局出现问题

场景:文章标题过长时,只显示一行,且多余的部分用省略号显示。 最终效果图: 实现时,flex布局,出现问题: 发现text-overflow: ellipsis不生效,省略符根本没有出现。 而且因为设置了 …

【IMX6ULL驱动开发学习】21.Linux驱动之PWM子系统(以SG90舵机为例)

1.设备树部分 首先在 imx6ull.dtsi 文件中已经帮我们定义好了一些pwm的设备树节点&#xff0c;这里以pwm2为例 pwm2: pwm02084000 {compatible "fsl,imx6ul-pwm", "fsl,imx27-pwm";reg <0x02084000 0x4000>;interrupts <GIC_SPI 84 IRQ_TYP…

【总结】p49常见问题和快捷键汇总

p49常见问题和快捷键汇总 基础概念常用快捷键汇总编辑器快捷键&#xff08;不包括视口操作&#xff09;蓝图快捷键 中英文命名注意事项帧和秒的概念带星号的文件的意思编译的作用实例和原素材情景关联返回的快捷键 虚幻引擎闪退问题 基础概念 常用快捷键汇总 编辑器快捷键&am…

中国政府版 Windows 10 开发完成,即将大规模推广

早在今年 3 月 20 日&#xff0c;就有媒体曝光中国政府专用 Windows 10 已经完成第一版。而就在今天微软在上海举办的发布会中&#xff0c;微软再次透露了中国政府版 Windows 10 的最新情况——已经开始试点测试。这就意味着政府版 Windows 10 或很快大规模推广。 据了解&#…

【设计模式】工厂模式

什么是工厂模式&#xff1f; Java的工厂模式是一种创建型设计模式&#xff0c;它提供了一种创建对象的最佳方式。在工厂模式中&#xff0c;我们在创建对象时不会对客户端暴露创建逻辑&#xff0c;而是通过使用一个共同的接口来指向新创建的对象。这种类型的设计模式属于创建型…

【C#学习笔记】引用类型(1)

文章目录 引用类型class匿名类 记录引用相等和值相等record声明 接口delegate 委托合并委托/多路广播委托 引用类型 引用类型的变量存储对其数据&#xff08;对象&#xff09;的引用&#xff0c;而值类型的变量直接包含其数据。 对于引用类型&#xff0c;两种变量可引用同一对…

10.物联网操作系统之低功耗管理

一。低功耗管理概念及其应用 1.STM32低功耗设计详解 STM32的电源管理系统主要分为&#xff1a; 备份域 调压器供电电路 ADC电源电路 2.低功耗模式 1.运行模式 2.睡眠模式 3.停机模式 4.待机模式 &#xff08;1&#xff09;睡眠模式 在睡眠模式中&#xff0c;仅关闭了内核时钟&…

数据结构——二叉树

本章代码仓库&#xff1a;堆、二叉树链式结构 文章目录 &#x1f36d;1. 树&#x1f9c1;1.1 树的概念&#x1f9c1;1.2 树的结构 &#x1f36c;2. 二叉树&#x1f36b;2.1 二叉树的概念&#x1f36b;2.2 特殊的二叉树&#x1f36b;2.3 二叉树的性质&#x1f36b;2.4 二叉树的存…

Julia 日期和时间

Julia 通过 Dates 模块提供了以下三个函数来处理日期和时间&#xff1a; Date&#xff1a;表示日期&#xff0c;精确到日&#xff0c;只显示日期。DateTime&#xff1a;表示日期和时间&#xff0c;精确到毫秒。DateTime&#xff1a;表示日时间&#xff0c;精确到纳秒&#xff…

【数据库】将excel数据导入mysql数据库

环境&#xff1a;Windows10 mysql8以上 将你要导入的excel表另存为txt格式 打开txt格式文件&#xff0c;删除表头行并另存为并更改编码方式&#xff08;由于与数据库的编码不同&#xff0c;会导致导入报错&#xff09; 通过命令行登录数据库 winr cmd进入 进入装mysql的目录位…

基于BIM+AI的建筑能源优化模型【神经网络】

推荐&#xff1a;用 NSDT设计器 快速搭建可编程3D场景。 AEC&#xff08;建筑、工程、施工&#xff09;行业的BIM 技术&#xff0c;允许在实际施工开始之前虚拟地建造建筑物&#xff1b; 这带来了许多有形和无形的好处&#xff1a;减少成本超支、更有效的协调、增强决策权等等。…

Windows批处理基础

一、【echo】显示文本内容 echo | Microsoft Learnhttps://learn.microsoft.com/zh-cn/windows-server/administration/windows-commands/echo 显示消息或者打开或关闭命令回显功能。 如果不结合任何参数使用&#xff0c;echo 会显示当前回显设置。 1.1、echo显示文本常用命…

AIGC大模型ChatGLM2-6B:国产版chatgpt本地部署及体验

1 ChatGLM2-6B介绍 ChatGLM是清华技术成果转化的公司智谱AI研发的支持中英双语的对话机器人。ChatGLM基于GLM130B千亿基础模型训练&#xff0c;它具备多领域知识、代码能力、常识推理及运用能力&#xff1b;支持与用户通过自然语言对话进行交互&#xff0c;处理多种自然语言任务…

【SQL】-【计算两个varchar类型的timestamp的毫秒差】

背景 TRANSTAMP3、TRANSTAMP2在Oracle数据库中的类型为varchar&#xff0c;但实际保存的值是时间戳timestamp类型&#xff0c;现在要计算二者的毫秒差 Oracle或MySQL extract(second from (to_timestamp(TRANSTAMP3,yyyy-mm-dd hh24:mi:ss.ff) - to_timestamp(TRANSTAMP2,yyy…