node.js [fs模块] 文件的读写
fs 模块
是Node.js官方提供的用来操作文件的模块。它提供了一系列的方法和属性,用来满足用户对文件的操作需求。 如:fs.readFile()方法 ,用来读取指定文件中的内容,fs.writeFile()方法,用来向指定的文件中写入内容。
一. 写入文件
<1> 普通写入文件(异步 & 同步)
(1) 异步写入:fs.writeFile()
该方法是异步的,即
JS 主线程
执行到该方法时,会把写入文件的交给I/O线程
去执行,然后自己向后继续执行,等到主线程把下面同步的代码执行完毕后,会从任务回调队列中取出该写入方法完成后的回调函数执行!!所以是异步的!!
接收四个参数:
-
参数1 :必选 ,指定文件的路径【不存在该文件的话,会按照所给路径新建一个文件!!】
-
参数2 :必选 ,要写入的内容
-
参数3 :可选 ,表示以什么样的格式写入文件内容【配置项】
-
参数4 :必选 ,文件写入完成后的回调函数 注意:回调函数的参数只有一个 err
(2) 同步写入:fs.writeFileSync()
该方法是同步的,即
JS主线程
会等待文件写入任务执行完毕后,再向下继续执行!!!
<2> 追加写入(异步 & 同步)
跟普通写入的语法是一样的:
- 异步:
fs.appendFile(x,x,x,x)
- 同步:
fs.appendFileSync(x,x,)
普通写入通过配置项实现追加写入:
普通写入
fs.writeFile()
,如果不添加配置项的话,是替换式的写入,即会用要写入的数据替换掉源文件中所有内容!!
fs.writeFile(x,x, {flag:'a'} ,x)
就可以实现追加写入!!
<3> 流式写入
通过与文件之间建立通道,然后经过通道进行写入。通道建立起后,可以进行多次写入!!
注意:
- 我们之前介绍的普通写入和追加写入,每次写入都要调用一次方法,且每次调用方法都要进行打开and关闭文件的操作!!【而打开和关闭文件又是需要消耗资源的】
所以:
- 流式写入适用于
大文件写入或者资源频繁写入的场景
let ws = fs.createWriteStream(path,[配置项])
ws.write('aa')
ws.write('bb')
ws.end()
<4> 写入文件的场景
平常,提到写入文件,我们可能想到的就是往文件里面写内容。但不是的,下面我们经常遇到的场景,其实也是文件写入的过程:
-
下载文件
- 其实就是把要下载的文件写入指定的文件夹中
-
安装软件
- 例如装系统,其实就是把操作系统写入到硬盘中
-
保存程序日志,如git
-
编辑器保存文件,如 vsCode
- 当我们每次 ctrl+s保存时,其实就是调用方法把编辑的内容写入到打开的文件中!!
-
视频录制
即当需要持久化保存数据时,就要想到文件写入!!
二. 读取文件
<1> 普通读取(异步 & 同步)
(1) 异步读取 : fs.readFile(x,x,x)
该方法接收三个参数:
-
path :文件所在路径
-
options : 配置项
-
callback :回调函数 【该回调函数接收两个参数( err,data )=>{ }】
- err 是读取错误的返回的错误对象
-
data是读取成功返回的读取到的数据【buffer的格式】
(2) 同步读取 : fs.readFileSync(x)
该方法返回读取到的数据,也是 buffer 的格式!!
注意:
- 因为读取方法返回的读取到的据都是 buffer 格式的,所以,如果我们要读到文件中存储的原内容,可以在 data 身上调用 toString() 方法!!
<2> 读取文件的应用场景
-
电脑开机
- 要首先把磁盘中的内容读取到内存中等待执行
-
程序运行
-
编辑器打开文件
- 编辑器打开文件,也是先读取文件中的内容,然后把内容呈现到指定位置
-
查看图片
-
播放视频、音乐
-
Git查看日志
-
查看聊天记录
<3> 流式读取
跟普通的读取方法不一样的就是,流式读取是一块一块的读的!!分 chunk 读!!
let rs = fs.createReadStream(path)
// 绑定 data 事件,开始读取
rs.on('data' , chunk=>{
console.log(chunk.length) // 65536字节 => 64KB
})
// 绑定 end 事件(可选)
rs.on('end' , ()=>{
console.log('读取完成')
})
三. 小案例————文件的复制
<1> 普通操作
let data = fs.readFileSync('../../yhx.js')
fs.writeFile('../../yhx.copy.js')
<2> 流式操作
const rs = fs.createReadStream('../../yhx.js')
const ws = fs.createWriteStream('../../yhx.copy.js')
rs.on('data',chunk=>{
ws.write(chunk);
})
rs.on('end',()=>{
console.log('结束了')
})
// 简写 rs.pipe(ws)
注意:
- 流式操作占用内存空间更少,因为普通操作需要一次性全部读进内存,再写入。而流式操作是边读边写!!
转载自:https://juejin.cn/post/7239895900296855608