Node.js中的fs模块:文件写入与读取

news2025/1/9 12:52:34

在Node.js中,fs模块提供了多种方法来写入和读取文件,使得数据的持久性保存变得简单。下面将介绍几种常用的文件写入方法,包括异步、同步写入、追加写入和流式写入,及异步读取、同步读取、流式读取等文件读取方法。

首先,在使用写入和读取功能前,我们需要导入fs模块,这是所有文件操作的基础:

const fs = require("fs");

一、文件写入

1. 异步写入

使用fs.writeFile方法异步写入文件。例如,写入一个三字经文件:

fs.writeFile("./三字经.txt", "人之初,性本善。", (err) => {
  if (err) {
    console.log("写入失败");
    return;
  }
  console.log("写入成功");
});
console.log("异步写入操作已发起");

注意console.log("异步写入操作已发起"); 会在 writeFile 回调之前执行,因为 writeFile 是异步的。

2. 同步写入

如果需要同步执行,可以使用fs.writeFileSync方法:

try {
  fs.writeFileSync("./data.txt", "text");
  console.log("同步写入成功");
} catch (err) {
  console.error("同步写入错误:", err);
}
console.log("同步写入操作已完成");

这里的console.log("同步写入操作已完成");会在writeFile回调之后执行,因为writeFileSync是同步的。

3. 异步追加写入

使用fs.appendFile方法可以异步追加内容到文件末尾:

fs.appendFile("./三字经.txt", "性相近,习相远。", (err) => {
  if (err) {
    console.log("追加失败");
    return;
  }
  console.log("追加成功");
});
4、同步追加写入

同样,fs.appendFileSync方法用于同步追加写入:

try {
  fs.appendFileSync("./data.txt", "\r\n追加text");
  console.log("同步追加成功");
} catch (err) {
  console.error("同步追加错误:", err);
}
5. 使用fs.writeFile实现追加写入

通过设置flag: 'a'选项,fs.writeFile也可以用于追加写入:

fs.writeFile("./三字经.txt", "\r\n苟不教,父之过。", { flag: 'a' }, (err) => {
  if (err) {
    console.error("追加写入失败:", err);
    return;
  }
  console.log("追加写入成功");
});
6. 流式写入

对于大文件或需要持续写入的数据,使用流(stream)是一个更好的选择。使用fs.createWriteStream创建一个写入流并写入数据:

const ws = fs.createWriteStream('./静夜思.txt');

ws.write('窗前明月光,\r\n'); 
ws.write("疑是地上霜。\r\n");
ws.write("举头望明月,\r\n"); 
ws.write("低头思故乡。\r\n"); 

// 关闭流,确保数据完全写入文件

ws.end(() => {
  console.log("流式写入完成");
});
//ws.close()

通常不需要显式调用ws.close()来关闭写入流,因为close方法不会等待数据被刷新到磁盘,可能会导致数据未完全写入文件。

可以使用ws.end(),它会在数据写入完成后自动关闭流,确保数据完全写入文件。。

二、文件读取

1、异步读取

使用fs.readFile方法可以异步读取文件内容。异步读取不会阻塞事件循环,这对于需要处理大量I/O操作的Node.js应用至关重要:

// 异步读取 radFile(这里以 "三字经.txt" 为例)
fs.readFile("./三字经.txt", (err, data) => {
  if (err) {
    console.log("读取失败");
    return;
  }
  console.log(data.toString());
});

2、同步读取

使用fs.readFileSync方法可以实现文件的同步读取。但请注意,同步读取会阻塞事件循环,直到文件读取完成。因此,在实际应用中,尤其是服务器应用中,通常不推荐使用同步读取:

// 同步读取 radFileSync(这里以 "三字经.txt" 为例)

let data = fs.readFileSync("./三字经.txt");

console.log(data.toString());

3、流式读取

流式读取更加灵活高效,它可以逐块读取文件内容,而不是一次性将整个文件加载到内存中。这对于处理大文件非常有用

使用 fs.createReadStream 方法可以创建一个可读流。

// 流式读取 createReadStream(这里以 "三字经.txt" 为例)
const rs = fs.createReadStream('./三字经.txt');

// 绑定data事件,每次读取到数据块时触发
rs.on('data', chunk => {
    console.log(chunk);
    // chunk 是一个 Buffer 对象,代表读取到的数据块
    // 处理文本文件时,可将Buffer对象转换为字符串:chunk.toString()
});

// 绑定end事件,读取完成时触发
rs.on('end', () => {
    console.log("读取完成");
});

// 绑定error事件,读取过程中发生错误时触发
rs.on('error', err => {
    console.error("读取错误:", err);
});

建议至少绑定 error 事件来避免未捕获的异常导致程序崩溃

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

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

相关文章

深度学习blog-深刻理解线性变换和矩阵

深度学习中避免不了矩阵运算,或者张量(其实是矩阵数组)运算。卷积是矩阵加、乘法,注意力也是一样。本质都一样,所谓注意力,卷积、滤波,是对不必了解数学的人说的,底层都是矩阵运算&a…

C/C++程序性能测试方法综述

摘要 性能测试是软件开发中不可或缺的一部分,特别是在对性能要求较高的C/C程序中。本文将详细介绍多种C/C程序性能测试方法,包括时间复杂度分析、事后统计方法、事前分析估算方法、使用性能测试工具(如Google Benchmark、gprof、Valgrind等&…

jmeter 中 BeanShell 预处理程序、JSR223后置处理程序使用示例

1. 各个组件如何新建的? 2. "http请求" 组件内容样例: "消息体数据" 源码: {"task_tag": "face_detect","image_type": "base64","extra_args": [{"model"…

电脑32位和64位之区别(Difference between 32-Bit and 64 Bit Computers)

电脑32位和64位之区别 很多小伙伴还不知道电脑32位和64位是什么意思,今天小编就来普及一下。 32位和64位是指电脑处理器(CPU)和操作系统的架构,决定了电脑如何处理数据、存储信息、运行程序等。 32位和64位是指电脑系统中每个处…

vue -关于浏览器localstorge数据定期清除的实现

1.实现背景 用户登录时的信息存在了localstorge中,但它会一直存在。一般来说,我们希望这个数据能够定期被清除掉,以下一个定时清除的实现。 2.实现原理 在用户登录时,将用户信息存入localstorge的同时,将当前时间作…

【JavaEE进阶】获取Cookie/Session

🍀Cookie简介 HTTP协议自身是属于 "⽆状态"协议. "⽆状态"的含义指的是: 默认情况下 HTTP 协议的客⼾端和服务器之间的这次通信,和下次通信之间没有直接的联系.但是实际开发中,我们很多时候是需要知道请求之间的关联关系的. 例如登陆⽹站成…

【工具变量】统计行业锦标赛激励数据集(2008-2023年)

一、数据简介 坚持创新驱动发展,要强化企业创新主体地位,发挥企业家在技术创新中的重要作用。作为企业组织内部最具有影响力的角色,高级管理人员拥有企业经营管理的自由裁量权,对企业战略决策及由此产生的经营绩效具有举足轻重的…

UVM: TLM机制

topic overview 不建议的方法:假如没有TLM TLM TLM 1.0 整个TLM机制下,底层逻辑离不开动作发起者和被动接受者这个底层的模型基础,但实际上,在验证环境中,任何一个组件,都有可能成为动作的发起者&#xff0…

Scratch023-(沙漠变绿洲)

提示: 知识回顾: 1、画笔的各个属性 2、“将笔的颜色设为”积木 3、“将笔的颜色增加”积木 文章目录 前言一、案例展示二、功能分析三、步骤拆解1.背景角色和画笔的初始化(1)初始化画笔2、一起绘制一个小雨滴3、绘制多个随机的小…

游戏语音趋势解析,社交互动有助于营造沉浸式体验

语音交互的新架构出现 2024 年标志着对话语音 AI 取得了突破,出现了结合 STT → LLM → TTS 模型来聆听、推理和回应对话的协同语音系统。 OpenAI 的 ChatGPT 语音模式将语音转语音技术变成了现实,引入了基于音频和文本信息进行端到端预训练的模型&…

详细全面讲解C++中重载、隐藏、覆盖的区别

文章目录 总结1、重载示例代码特点1. 模板函数和非模板函数重载2. 重载示例与调用规则示例代码调用规则解释3. 特殊情况与注意事项二义性问题 函数特化与重载的交互 2. 函数隐藏(Function Hiding)概念示例代码特点 3. 函数覆盖(重写&#xff…

计算机网络之---物理层设备

什么是物理层设备 物理层设备是指负责数据在物理媒介上传输的硬件设备,它们主要处理数据的转换、信号的传输与接收,而不涉及数据的内容或意义。常见的物理层设备包括网卡、集线器、光纤收发器、调制解调器等。 物理层设备有哪些 1、网卡(N…

js状态模式

允许一个对象在其内部状态改变时改变它的行为。 状态模式将对象的状态封装成独立的类,并使它们可以互相转换 // 定义状态接口class State {constructor() {if (this.constructor State) {throw new Error(不能实例化抽象类);}}// 定义状态方法handle(context) {th…

平面坐标转大地坐标(arcgisPro中进行)

1、将需要转换的红线导入arcgisPro中,如下: 2、在地图菜单栏中,选择坐标转换工具,如下: 3、打开坐标转换工具 4、开启捕捉 5、 设置大地坐标显示格式 6、如下: 7、显示如图: 8、再依次添加几个待…

(长期更新)《零基础入门 ArcGIS(ArcScene) 》实验七----城市三维建模与分析(超超超详细!!!)

城市三维建模与分析 三维城市模型已经成为一种非常普遍的地理空间数据资源,成为城市的必需品,对城市能化管理至关重要。语义信息丰富的三维城市模型可以有效实现不同领域数据与IS相信息的高层次集成及互操作,从而在城市规划、环境模拟、应急响应和辅助决策等众多领域公挥作用、…

SpringBootWeb 登录认证(day12)

登录功能 基本信息 请求参数 参数格式:application/json 请求数据样例: 响应数据 参数格式:application/json 响应数据样例: Slf4j RestController public class LoginController {Autowiredpriva…

夯实前端基础之HTML篇

知识点概览 HTML部分 1. DOM和BOM有什么区别? DOM(Document Object Model) 当网页被加载时,浏览器会创建页面的对象文档模型,HTML DOM 模型被结构化为对象树 用途: 主要用于网页内容的动态修改和交互&…

UI自动化测试保姆级教程--pytest详解(精简易懂)

欢迎来到啊妮莫的学习小屋 别让过去的悲伤,毁掉当下的快乐一《借东西的小人阿莉埃蒂》 简介 pytest是一个用于Python的测试框架, 支持简单的单元测试和复杂的功能测试. 和Python自带的UnitTest框架类似, 但是相比于UnitTest更加简洁, 效率更高. 特点 非常容易上手…

有序数据中插入不确定数据保证数据插入的位置顺序正确排序

解决有序数据中插入不确定数据保证数据插入的位置顺序正确排序 前言 java 数据库中存储自增id 有序的数据, 前端页面基于 id 5和 6 之间新增一条数据,在 id 6 和 7之间新增 2条,或者更复杂的场景,后台接口如何保存数据使得页面数…

基于 Apache Commons Pool 实现的 gRPC 连接池管理类 GrpcChannelPool 性能分析与优化

基于 Apache Commons Pool 实现的 gRPC 连接池管理类 GrpcChannelPool 性能分析与优化 1. 输出关键信息的代码示例 日志记录方法 使用以下代码记录连接池的关键信息,帮助分析连接池的状态和性能瓶颈: import org.apache.commons.pool2.impl.GenericO…