likes
comments
collection
share

node.js [fs模块] 文件的读写

作者站长头像
站长
· 阅读数 30

fs 模块是Node.js官方提供的用来操作文件的模块。它提供了一系列的方法和属性,用来满足用户对文件的操作需求。 如:fs.readFile()方法 ,用来读取指定文件中的内容,fs.writeFile()方法,用来向指定的文件中写入内容。

一. 写入文件

<1> 普通写入文件(异步 & 同步)
(1) 异步写入:fs.writeFile()

该方法是异步的,即 JS 主线程执行到该方法时,会把写入文件的交给I/O线程去执行,然后自己向后继续执行,等到主线程把下面同步的代码执行完毕后,会从任务回调队列中取出该写入方法完成后的回调函数执行!!所以是异步的!!

接收四个参数:

  • 参数1 :必选 ,指定文件的路径【不存在该文件的话,会按照所给路径新建一个文件!!】

  • 参数2 :必选 ,要写入的内容

  • 参数3 :可选 ,表示以什么样的格式写入文件内容【配置项】

  • 参数4 :必选 ,文件写入完成后的回调函数 注意:回调函数的参数只有一个 err

node.js [fs模块] 文件的读写

(2) 同步写入:fs.writeFileSync()

该方法是同步的,即 JS主线程会等待文件写入任务执行完毕后,再向下继续执行!!!

node.js [fs模块] 文件的读写

<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
评论
请登录