/*
* 需求:
* 新建一个文件,座右铭.txt,写入内容,三人行,必有我师焉
* */
//1、导入fs模块
const fs=require('fs')
// 2.写入文件
fs.writeFile('./座右铭.txt','三人行,必有我师焉',err=>{
// err,写入失败:错误对象 写入成功:null
if(err){
console.log("写入失败")
return;
}
console.log("写入成功!")
})
同步:
异步:
const fs=require('fs')
//异步写入
fs.writeFile('./座右铭.txt','师夷长技以制夷',err=>{
if(err){
console.log("写入失败!")
}
console.log("写入成功!")
})
console.log("你好啊~")
const fs=require('fs')
//同步写入
fs.writeFileSync('./data.txt','数据在此')
console.log("你好啊")
注意:
Node.js 中的磁盘操作是由其他 线程 完成的,结果的处理有两种模式:
同步处理 JavaScript 主线程 会等待 其他线程的执行结果,然后再继续执行主线程的代码,效率较低
异步处理 JavaScript 主线程 不会等待 其他线程的执行结果,直接执行后续的主线程代码,效率较好
//追加写入
const fs=require('fs')
// \r\n 换行
fs.appendFile('./座右铭.txt','\r\n三人行,必有我师焉。',err=>{
if(err){
console.log("写入失败!")
return
}
console.log('写入成功!')
})
const fs=require('fs')
fs.appendFileSync('./座右铭.txt','择其善者而从之,其不善者而改之。')
const fs=require('fs')
fs.writeFile('./座右铭.txt','\r\nover over over',{flag:'a'},err=>{
if(err){
console.log("写入失败!")
return;
}
console.log('写入成功!')
})
// 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()
创建流相当于一个人给另一个人打电话的通话时间,写入相当于给别人说话,关闭通道相当于挂断电话
当需要持久化保存数据 的时候,应该想到 文件写入
const fs=require('fs')
fs.readFile('./静夜思.txt',(err,data)=>{
if(err){
console.log("读取失败!")
return;
}
console.log(data.toString())
})
const fs=require('fs')
let data=fs.readFileSync('./静夜思.txt')
console.log(data.toString());
流式读取:分块读取(分块加载到内存)
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('读取完成')
})
…
文件复制:复制【资料】文件夹下的【动画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)
})
两种方式比价下来,第二种更节约内存资源。
因为第一种是一次性将文件读取到内存,然后再执行之后的工作
第二种是读一块到内存,然后再写一块到文件中
注意的是,实质上读取速度是比写入速度要快的,所以一般是读取几块才会写一块
但是即便如此,也是第二种方式更节约内存资源
//比较内存资源
// 方式一
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)