前言:

        在Node.js生态系统中,文件系统操作是后端开发不可或缺的一部分。fs模块作为Node.js核心API的重要组成部分,提供了与文件系统交互的能力,涵盖了从基础的文件读写到复杂的目录操作等功能。

        现代JavaScript开发中,处理本地文件是常见需求,无论是配置文件读取、日志记录还是数据持久化存储。fs模块通过同步和异步两种方式提供这些功能,适应不同场景的性能要求。

        随着Node.js版本的迭代,fs模块不断加入新的特性,如Promise-based API的引入,使得文件操作能够更好地融入现代异步编程模式。理解并掌握fs模块,对于构建健壮的Node.js应用具有重要意义。

        本部分内容将深入解析fs模块的核心功能,包括常用方法的原理和使用场景,帮助开发者高效安全地处理文件系统操作,为构建复杂应用打下坚实基础。

1.读取文件

1.同步

        使用readFileSync方法,它的写法简洁,但会阻塞后面的代码执行,基本代码如下:

const fs = require('fs')// 同步写法 会阻塞后面代码执行
const read = fs.readFileSync('./a.txt', 'utf8')
console.log(read)

        在终端中使用 node 文件名 将内容打印出来

        readFileSync('需要读取文件的文件名', '编码')

2.异步

        使用readFile方法,它接收三个参数,第一个是需要读取文件的文件名,第二个参数可以接受一个对象,可以在里面设置一些行为,就比如说设置读取到文字的编码,第三个参数接受一个回调函数,基本的写法如下:

const fs = require('fs')// 异步
fs.readFile('./a.txt', {encoding: 'utf8', // 编码flag: 'r' // 读取
}, (err, data) => {if (err) throw err // 将错误抛出console.log(data)
})

3.promise

        这种写法就可以通过.then或.catch来处理成功或失败的结果,我个人还是推荐使用这种写法。代码如下:

const fs = require('fs/promises')// promise
fs.readFile('./a.txt').then(result => {console.log(result.toString('utf8'));
}).catch(err => {throw err
}).finally(()=>{console.log('不管成功与否我都执行');
})

        看到这可能有些人有点蒙,为什么编码有这么多种写法,其实这三种都是可以的,看个人习惯,以及需求。

4.可读流

        在处理大文件时会使用到可读流,它会将文件里的内容一点一点传过来,假设有一个很大内存的文件,不可能使用readFile一直等着,代码如下:

const fs = require('fs')// 可读流 处理大文件
const readStream = fs.createReadStream('./a.txt')readStream.on('data', chunk => {console.log(chunk.toString())
})readStream.on('end', () => {console.log('读取完成了')
})

2.创建文件夹

        使用到了mkdirSync,一般都是同步的,因为创建一个文件夹的速度是非常快的。代码如下:

const fs = require('fs')// 创建文件夹
fs.mkdirSync('./a')

        如果需要创建一个嵌套的文件夹,会发现比如将路径改为./a/b/c,这样是不行的,那如何创建呢,可以使用递归,当然不用我们直接写,只需要添加第二个参数即可,代码如下:

const fs = require('fs')// 创建嵌套文件夹
fs.mkdirSync('./a/b/c', {recursive: true
})

3.删除

        这个比较简单,使用rm方法,命名跟Linux差不多。代码如下:

const fs = require('fs')// 删除
fs.rmSync('./a', {recursive: true
})

        如果是嵌套的文件夹,只需要递归删除即可。

4.重命名

const fs = require('fs')// 重命名
fs.renameSync('./a.txt', './b.txt')

        第一个参收是需要重命名文件名称,第二个参数是要修改的名称。

5.监听文件的变化

        使用watch方法,许多热更新的底层原来就用到了这个。代码如下:

const fs = require('fs')// 监听文件的变化
fs.watch('./a.txt', (event, filename) => {console.log(event, filename);
})

        当我修改a.txt中的内容时,这个事件就会触发

6.写入文件

        使用writeFile或writeFileSync方法,代码如下:

const fs = require('fs')// 写入文件
fs.writeFileSync('./a.txt', '666')

        当运行脚本会发现,它会将原来文本里面的内容替换成我们写入的内容,而不是追加,接下来就来说追加的操作。

7.追加写入文件

1.第一种方法(writeFileSync)

        写入的方法也有追加的功能,添加第三个参数,代码如下:

const fs = require('fs')// 追加文件
fs.writeFileSync('./a.txt', '\n777', {flag: 'a'
})

        a的意思是append追加的意思

2.第二种方法(appendFileSync)

const fs = require('fs')// 追加文件
fs.appendFileSync('./a.txt', '\n888')

8.可写流

        从名字可以看出和可读流类似,可以回顾一下可读流的意思就可以大致猜到可写流是什么意思。

        可写流的意思就是将大量的数据分批插入。

const fs = require('fs')// 可写流const writeStream = fs.createWriteStream('./a.txt')const data = ["青山衔落日,","碧水映霞飞。","风过荷香漫,","蝉鸣暮色微。","孤舟横野渡,","倦鸟宿林扉。","欲寄乡思远,","星河入梦归。"
]data.forEach(item => {writeStream.write(item + '\n')
})// 记得关闭 不然通道一直打开
writeStream.end()// 也可以添加事件 就比如通知写入完成
writeStream.on('finish',() => {console.log('写入完成');
})

结语:

        Node.js的fs模块为开发者提供了强大而灵活的文件系统操作能力,覆盖从基础读写到高级流处理的各类场景。通过同步、异步和Promise三种模式,开发者可根据项目需求选择最佳实践方式,平衡代码可读性与性能要求。

        文件流处理技术(可读流/可写流)尤其适合大文件操作场景,有效避免内存压力。目录创建与删除的递归选项、文件监听机制等特性,为构建自动化工具和实时系统提供了底层支持。

        现代JavaScript开发中,建议优先考虑Promise-based API或异步模式,结合错误处理机制构建健壮的应用。掌握这些核心方法后,开发者可以高效实现配置文件管理、日志系统、数据持久化等关键功能,为复杂Node.js应用奠定坚实基础。

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

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

相关文章

HarmonyOS学习2---Stage模型

1、工程目录结构 1.1、入口 UIAbility 1.2、入口page 1.3、配置文件 1、配置文件 1)应用级配置文件 --- app.json5 2)模块级配置文件 --- module.json5 3、oh-package.json5 4、资源文件 1)element目录 2)media目录 3&#xff09…

【软件工程】软件复刻项目的完整流程指南

软件复刻项目的完整流程指南 第一章、概述 一、前期准备:明确目标与合规性 1. 法律风险评估 版权排查:确认目标软件的 UI 设计、代码、商标是否受保护(如界面元素、核心算法是否申请专利)。规避侵权:避免直接复制 …

浅谈Python 中的当前工作目录与脚本目录

Python 中的 os.path.exists() 和 __file__ 使用陷阱:工作目录 ≠ 脚本目录 在使用 os.path.exists() 或 open() 等函数操作文件路径时,笔者常常忽略一个关键概念:当前运行目录(Current Working Directory, CWD)并不等…

iOS检测并阻止骚扰电话的方法

检测并阻止骚扰电话 你可以在 iPhone 上使用“将未知来电者设置为静音”或第三方 App 来阻止骚扰电话。 打开“将未知来电者设置为静音” 在 iOS 13 及更高版本中,你可以打开“静音未知来电”,以免接到陌生人的来电。这一功能可以阻止那些你从未联系过…

TensorFlow源码深度阅读指南

TensorFlow源码深度阅读指南 本文基于《TensorFlow内核剖析》附录A的代码阅读方法论,结合实例解析核心源码阅读技巧(含关键图示):一、源码阅读的四个维度 1. 分层切入策略(图A-1) #mermaid-svg-ooLMzaWU5ky…

设计模式-责任链模式、策略模式

责任链模式 Chain of Responsibility(职责链)—对象行为型模式定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象…

泛微e-cology remarkOperate远程命令执行漏洞

【高危】泛微e-cology remarkOperate远程命令执行漏洞 漏洞描述 泛微e-cology是泛微公司开发的协同管理应用平台。 受影响版本中,接口 /api/workflow/reqform/remarkOperate 存在 SQL 注入漏洞,multipart 类型参数 requestid 直接拼接进 SQL 语句&…

Redis常用操作

1:redis常用操作: package com.shunaier.hhhh.biz.utils;import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.shunaier.hhhh.common.enums.SystemErrorEnum; import com.shunaier.hhhh.common.exception.SNEB…

mybatis-plus-01-环境初始化及简单应用

文章目录 【README】【1】springboot集成mybatis-plus配置【1.1】目录结构【相关说明】 【1.2】代码示例【pom.xml】【application.properties】【MybatisPlusNoteController】【UserAppService】【UserMapper】【UserPO】【建表语句】 【2】演示 【README】 本文代码参见&…

VR小鼠解剖虚拟仿真:开启生命科学教育新视野​

VR 小鼠解剖虚拟仿真,是一项将虚拟现实(VR)技术深度融入小鼠解剖学习与研究过程的创新应用,即 VR 小鼠解剖虚拟仿真。其核心原理在于,借助 VR 技术所构建的高度逼真的虚拟环境,突破了传统小鼠解剖在时间、空间以及实体操作上的诸多…

计算机网络(网页显示过程,TCP三次握手,HTTP1.0,1.1,2.0,3.0,JWT cookie)

前言 最近一直在后端开发的面经🙌,里面涉及到了好多计算机网络的知识😁,在这里以问题的形式写一个学习笔记(其中参考了: JavaGuide 和 小林coding 这两个很好的学习网站😘) 1.当键入网址后&am…

Redis 消息的发布和订阅

Redis 消息的发布和订阅 1、什么是发布和订阅 Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。 Redis 客户端可以订阅任意数量的频道。 2、Redis的发布和订阅示意 1、客户端可以订阅频道如下图 2、当…

python优先队列使用

heapq 是 Python 的一个内置模块,提供了堆队列算法的实现,也称为优先队列算法。以下是关于 heapq 模块的详细使用说明。 基本概念 堆:一种特殊的二叉树结构,满足父节点总是小于或等于其子节点(最小堆)特性…

在 Windows 机器上安装和配置 RabbitMQ

RabbitMQ 它是一款基于 AMQP(高级消息队列协议)的流行消息代理。RabbitMQ 适用于 Windows、Linux 和 macOS,易于安装和使用,并提供一系列强大的消息队列和路由功能。要在 Windows 计算机上使用 RabbitMQ,您必须先安装 …

第十五节:第六部分:日志技术:logback的核心配置文件详解、日志级别

核心配置文件logback.xml 什么是日志级别,为什么要学日志级别

从入门到精通:数据库全攻略

目录一、数据库基础概念1.1 数据库定义1.2 数据库与文件系统的区别1.3 数据库系统组成部分1.4 关系型数据库与非关系型数据库二、数据库安装与配置2.1 下载 MySQL2.2 安装 MySQL2.3 初始化数据库服务器2.4 启动和停止 MySQL 服务2.5 登录 MySQL2.6 创建数据库2.7 创建数据表三、…

【JAVA】消息队列(MQ)是个好东西

一、前言再JAVA系统开发中,再高并发的场景经常需要使用到消息队列,有时候是不得不使用到消息对了。特别是大数据量的并发处理。对数据实时性要求又没那么高的情况下。用户请求 → 接入层(Nginx) → 限流 → 消息队列 → 订单服务 → 库存服务 → 支付服务…

【Golang面试题】Go结构体的特点,与其它语言的区别

Go 结构体深度解析:与 C/C、Java 的全面对比 一、核心概念对比特性Go 结构体 (struct)C/C 结构体 (struct)Java 类 (class)本质值类型复合数据类型值类型复合数据类型引用类型内存分配栈或堆 (编译器决定)栈 (显式控制)堆 (JVM管理)默认访问权限首字母大写导出publi…

CppCon 2018 学习:OOP is dead, long live Data-oriented design

探讨了面向对象编程(OOP)的一些根本性问题深入理解: 标题:What is so wrong with OOP? 什么是面向对象的问题? 这不是说 OOP “绝对错误”,而是指出它在实践中经常引发的问题,尤其是在性能敏…

科学的第五范式:人工智能如何重塑发现之疆

在人类探索未知的壮阔史诗中,科学方法的演进如同照亮迷雾的灯塔。从基于经验的第一范式(描述自然现象),到以理论推演为核心的第二范式(牛顿定律、麦克斯韦方程),再到以计算机模拟为标志的第三范…