Nodejs基础一
fs模块
- fs全称为 file system 文件系统
- fs模块可以实现与硬盘的交互
例如文件的创建、删除、重命名、移动
还有文件内容的写入、读取,
以及文件夹的相关操作
文件写入
writeFile文件写入
/*
* 需求:
* 新建一个文件,座右铭.txt,写入内容,三人行,必有我师焉
* */
//1、导入fs模块
const fs=require('fs')
// 2.写入文件
fs.writeFile('./座右铭.txt','三人行,必有我师焉',err=>{
// err,写入失败:错误对象 写入成功:null
if(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 字节 64KB
console.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)