Nodejs基础2之fs模块
Nodejs基础一
- fs模块
- 文件写入
- writeFile文件写入
- fs异步与同步
- writeFile异步执行
- writeFileSync同步写入
- fs追加写入
- appendFile 异步追加写入
- appendFileSync 同步追加写入
- writeFile 实现追加写入
- 文件流式写入
- createWriteStream 流式写入
- 文件写入应用场景
- 文件读取
- readFile 文件读取(异步)
- readFileSync 同步读取
- 读取文件的应用场景
- fs 流式读取
- fs练习-复制文件
- 方法一:用读取写入文件的方式
- 方法二:用读写流的方式
- 两种方式比较
- 使用process.memoryUsage()比较两种资源大小
- 读写流方式简写
fs模块
- fs全称为 file system 文件系统
- fs模块可以实现与硬盘的交互
例如文件的创建、删除、重命名、移动
还有文件内容的写入、读取,
以及文件夹的相关操作
文件写入
writeFile文件写入
/*
* 需求:
* 新建一个文件,座右铭.txt,写入内容,三人行,必有我师焉
* *///1、导入fs模块
const fs=require('fs')// 2.写入文件
fs.writeFile('./座右铭.txt','三人行,必有我师焉',err=>{// err,写入失败:错误对象 写入成功:nullif(err){console.log("写入失败")return;}console.log("写入成功!")
})


fs异步与同步
同步:

异步:

writeFile异步执行
const fs=require('fs')//异步写入
fs.writeFile('./座右铭.txt','师夷长技以制夷',err=>{if(err){console.log("写入失败!")}console.log("写入成功!")
})console.log("你好啊~")


writeFileSync同步写入
const fs=require('fs')
//同步写入
fs.writeFileSync('./data.txt','数据在此')console.log("你好啊")


注意:
Node.js 中的磁盘操作是由其他 线程 完成的,结果的处理有两种模式:
同步处理 JavaScript 主线程 会等待 其他线程的执行结果,然后再继续执行主线程的代码,效率较低
异步处理 JavaScript 主线程 不会等待 其他线程的执行结果,直接执行后续的主线程代码,效率较好
fs追加写入
appendFile 异步追加写入
//追加写入
const fs=require('fs')
// \r\n 换行
fs.appendFile('./座右铭.txt','\r\n三人行,必有我师焉。',err=>{if(err){console.log("写入失败!")return}console.log('写入成功!')
})


appendFileSync 同步追加写入
const fs=require('fs')
fs.appendFileSync('./座右铭.txt','择其善者而从之,其不善者而改之。')

writeFile 实现追加写入
const fs=require('fs')
fs.writeFile('./座右铭.txt','\r\nover over over',{flag:'a'},err=>{if(err){console.log("写入失败!")return;}console.log('写入成功!')
})


文件流式写入
createWriteStream 流式写入
// 1. 导入fs
const fs=require('fs')// 2. 创建写入流对象
const ws=fs.createWriteStream('./静夜思.txt')// 3. write
ws.write('床前明月光,\r\n')
ws.write('疑是地上霜。\r\n')
ws.write('举头望明月,\r\n')
ws.write('低头思故乡。\r\n')// 4. 关闭通道
ws.close()

创建流相当于一个人给另一个人打电话的通话时间,写入相当于给别人说话,关闭通道相当于挂断电话
文件写入应用场景
- 下载文件
- 安装软件
- 保存程序日志,如 Git
- 编辑器保存文件
- 视频录制
当需要持久化保存数据 的时候,应该想到 文件写入
文件读取
readFile 文件读取(异步)
const fs=require('fs')fs.readFile('./静夜思.txt',(err,data)=>{if(err){console.log("读取失败!")return;}console.log(data.toString())
})

readFileSync 同步读取
const fs=require('fs')let data=fs.readFileSync('./静夜思.txt')console.log(data.toString());

读取文件的应用场景
- 电脑开机
- 程序运行
- 编辑器打开文件
- 查看图片
- 播放视频
- 播放音乐
- Git 查看日志
- 上传文件
- 查看聊天记录
fs 流式读取
流式读取:分块读取(分块加载到内存)
readFile:一次性读取

// 1.引入fs模块
const fs=require('fs')
// 2.创建读取流对象
const rs=fs.createReadStream('./动画1.gif')
// 3. 绑定data事件,chunk是一块
rs.on('data',chunk=>{console.log(chunk) //65536 字节 64KBconsole.log(chunk.length)
})
// 4.end 事件
rs.on('end',()=>{console.log('读取完成')
})

…

fs练习-复制文件
文件复制:复制【资料】文件夹下的【动画1.gif】到 【复制文件】文件夹下一份
方法一:用读取写入文件的方式
//方法一:readFile和writeFile
const fs=require('fs')
//读取文件内容
let data=fs.readFileSync('./资料/动画1.gif')
//写入文件
fs.writeFileSync('./资料/复制文件/动画1-1.gif',data)

方法二:用读写流的方式
//方法二:用读写流的方式
const fs=require('fs')
//创建读取流对象
const rs=fs.createReadStream('./资料/动画1.gif')
//创建写入流对象
const ws=fs.createWriteStream('./资料/复制文件/动画1-2.gif')
//绑定data对象
rs.on('data',chunk=>{ws.write(chunk)
})

两种方式比较
两种方式比价下来,第二种更节约内存资源。
因为第一种是一次性将文件读取到内存,然后再执行之后的工作
第二种是读一块到内存,然后再写一块到文件中
注意的是,实质上读取速度是比写入速度要快的,所以一般是读取几块才会写一块
但是即便如此,也是第二种方式更节约内存资源
使用process.memoryUsage()比较两种资源大小
//比较内存资源
// 方式一
const fs=require('fs')
const process=require('process')
//读取文件
let data=fs.readFileSync('./资料/测试.mp4')
//写入文件
fs.writeFileSync('./资料/复制文件/测试1.mp4',data)
console.log(process.memoryUsage());

53108736 => 50MB
//方式二
const fs=require('fs')
const process=require('process')
//创建读取流对象
let rs=fs.createReadStream('./资料/测试.mp4')
//创建写入流对象
let ws=fs.createWriteStream('./资料/复制文件/测试1-2.mp4')
//data 事件
rs.on('data',chunk=>{ws.write(chunk)
})
rs.on('end',()=>{console.log(process.memoryUsage())
})

26288128 => 25MB

对比以上两个方法,得出第二种方法更节约内存资源
读写流方式简写
//简写:
const fs=require('fs')
//const process=require('process')
//创建读取流对象
let rs=fs.createReadStream('./资料/测试.mp4')
//创建写入流对象
let ws=fs.createWriteStream('./资料/复制文件/测试1-3.mp4')
//data 事件
// rs.on('data',chunk=>{
// ws.write(chunk)
// })
// rs.on('end',()=>{
// console.log(process.memoryUsage())
// })//简写
rs.pipe(ws)
