Nodejs实现读写文件和文件流

news2024/9/24 19:22:37

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.coloradmin.cn/o/839115.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

echarts 图例组件legend配置

legend 图例组件展示不同系列的图表类型标记、颜色、和名称。可以通过点击来控制哪个系列不展示。对于饼图来说,控制哪个数据不展示。 $> echarts5.4.0简单画一个饼图作为示例,设置legend:{show:true}展示图例。 const options {legend: {show: true,},series…

WMS仓库管理系统研发规划说明

01 产品背景 1.1 背景概述 aboss WMS东南亚仓库管理系统是一个基于BigSeller系统的使用基础上,加上多仓库的解决思路,解决入库业务、出库业务、仓库调拨、库存调拨和虚仓管理等功能,对批次管理、物料对应、库存盘点、质检管理、虚仓管理和即…

Mac与windows传文件(超过4G且速度超快,非共享)

MAC与Windows文件互传 背景 尝试了网上的一些方法,诸如设置共享文件夹方法等,但是实际使用中感觉效果一般,对于一些小的文件共同编辑速度还可以。但是在备份或者传递一些较大文件或者很多细小文件的时候就有点捉襟见肘了。制作了一个MAC可读…

规划模型Matlab代码

文章目录 数学规划定义一般形式分类 1.线性规划(linear programming)2.非线性规划(nonlinear programming)3. 整数规划(integer programming)4. 0-1规划(0-1 programming)5. 最大最小化模型6. 多目标规划模型7.敏感性分析(对权重)[例题] 数学规划定义 数…

基于SSM试题库管理系统

试题库管理系统(基于SSM) 运行环境:JDK 1.8 MySQL 5.7 Tomcat 8.0.53 编码集:UTF-8 IDE:eclipse 4.8.0 数据库 库名: 用户名:root 密码:admin 登录界面: 学生界面: 教师界面…

C++ ------ new关键字和delete关键字

文章目录 C/C内存分布C内存管理方式 operator new 与 operator delete 函数new和delete的实现原理内置类型自定义类型 定位new表达式 C/C内存分布 我们来看下面的一个题目: int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar …

使用强化学习破解迷宫实战

大家好,本文将实现一种强化学习算法来解决迷宫问题,并完成以下步骤:创建迷宫环境、定义迷宫类,以及使用值迭代算法(Value Iteration algorithm)找到穿越迷宫的最优策略。为了使这一过程可视化,使…

Stable Diffusion系列课程二:ControlNet

AUTOMATIC1111/stable-diffusion-webui参考B站Nenly视频《零基础学会Stable Diffusion》、视频课件推荐网站:stable-diffusion-art、Civitai(魔法) 、libilibi、AI艺术天堂推荐Stable Diffusion整合资料: NovelAI资源整合、《AI绘…

Flowable-网关-并行网关

目录 定义图形标记XML内容使用示例视频教程 定义 并行网关能在一个流程里用来对并发进行建模处理,它能把单条线路拆分成多个路径并行执 行,或者将多个路径合并处理。在一个流程模型里引入并发最直接的网关就是并行网关,它基于进 入和外出顺序…

回归预测 | MATLAB实现基于SVM-RFE-BP支持向量机递归特征消除特征选择算法结合BP神经网络的多输入单输出回归预测

回归预测 | MATLAB实现基于SVM-RFE-BP支持向量机递归特征消除特征选择算法结合BP神经网络的多输入单输出回归预测 目录 回归预测 | MATLAB实现基于SVM-RFE-BP支持向量机递归特征消除特征选择算法结合BP神经网络的多输入单输出回归预测预测效果基本介绍研究内容程序设计参考资料…

Android Studio中使用cmake开发JNI实战

JNI学习大纲 一、JNI编程入门 二、Android Studio中使用cmake开发JNI实战 第一章节我们介绍了JNI的开发步骤,那这一章节我们就开始在Android Studio中实战一下吧,Lets Start。 1. Android Studio中安装CMake插件 AS中菜单栏选择Tools>SDK Manager在…

Servlet是什么和创建、配置第一个servlet

Servlet是什么和创建、配置第一个servlet servlet是什么 2、创建servlet 方式一: 方式二: 方式三:

vscode中无法使用git解决方案

1 首先查看git安装目录 where git 2 找到bash.exe 的路径 比如:C:/Users/Wangzd/AppData/Local/Programs/Git/bin/bash 3 找到vscode的配置项setting.json 4 添加 "terminal.integrated.shell.windowns": "C:/Users/Wangzd/AppData/Local/Pr…

Python如何解决Amazon亚马逊“图文验证码”识别(6)

前言 本文是该专栏的第55篇,后面会持续分享python爬虫干货知识,记得关注。 在本专栏前面,笔者有详细介绍多种登录验证码识别方法,感兴趣的同学可往前翻阅。而本文,笔者将单独详细介绍亚马逊Amazon的图文识别验证码的解决方法。 如上图所示,访问或请求频次达到一定程度之…

IPv6地址分类,EUI-64转换规则

1、可聚合的单全球单播地址Global Unique Address: Aggregate global unicast address,前3位是001,即2000::/3,目前IANA已经将一部分可聚合全球单播进行了专门使用,如:2001::/16用于IPV6互联网,…

深挖 Threads App 帖子布局,我进一步加深了对CSS网格布局的理解

当我遇到一个新产品时,我首先想到的是他们如何实现CSS。当我遇到Meta的Threads时也不例外。我很快就探索了移动应用程序,并注意到我可以在网页上预览公共帖子。 这为我提供了一个深入挖掘的机会。我发现了一些有趣的发现,我将在本文中讨论。 …

Docker相关命令与入门

1. Docker 命令 # centos 7 systemctl start docker # 启动服务 systemctl stop docker systemctl restart docker # 重启服务 systemctl status docker systemctl enable docker # 开机自启动1.1 镜像相关的命令 # 查看镜像 docker images docker images -q # 查看…

深度学习:探究Tensor和Numpy

目录 引言 1 pytorch中Tensor 1.1 什么是Tensor 1.2 为什么需要Tensor 1.3 如何创建Tensor 1.3.1 从已有其他数据结构转化创建为Tensor 1.3.2 随机初始化一个Tensor 1.3.3 从已保存文件加载一个Tensor 1.4 Tensor的特性 1.4.1 丰富的常用函数操作 1.4.2 灵活的dtype和…

使用TensorBoard进行可视化

1. TensorBoard介绍 TensorBoard是TensorFlow推出的可视化工具,可以可视化模型结构、跟踪并以表格形式显示模型指标。 TensorBoard的使用包括两个步骤: 在代码中设置TensorBoard,在训练的过程中将会根据设置产生日志文件在浏览器中可视化该…

启动RocketMQ报错

说明:启动RocketMQ消费者时,报以下错误:java.lang.IllegalStateException:Failed to start RocketMQ push consumer. 解决:看下所有的监听器类,检查是不是有相同的消费者组名,注释掉其中一个即可…