node是什么?node可以看作是服务器端的JAVASCRIPT。除了对文件进行操作,NODE可以连接数据库,多线程等。
node.js不支持BOM和DOM的API,但可以使用console和定时器API,node.js的顶级对象为global,也可以用globalThis访问顶级对象。
Buffer缓冲区,是一段处理二进制数据的内存空间。
- 创建Buffer的三种方法:
// alloc创建 会清空旧的内存空间
let buf = Buffer.alloc(10);
console.log(buf)
// allocUnsafe 可能包含旧的内存空间
let buf2 = Buffer.allocUnsafe(10);
console.log(buf2)
// from 字符串创建
let buf3 = Buffer.from("hello")
console.log(buf3)
//通过数组创建 Buffer
let buf_4 = Buffer.from([105, 108, 111, 118, 101, 121, 111, 117]);
console.log(buf3)
buffer与字符串转换
let buf_4 = Buffer.from([105, 108, 111, 118, 101, 121, 111, 117]);
console.log(buf_4.toString())
对buffer进行读写
//读取
console.log(buf_3[1]);
// 修 改
buf_3[1] = 97;
//查看字符串结果
console.log(buf_3.toString());
注意:
- 如果修改的数值超过 255 ,则超过 8 位数据会被舍弃
- 一个utf-8 的字符 一般 占 3 个字节
fs模块
fs模块是node.js实现与硬盘的交互的模块,用于文件管理,实现写入、读取、追加内容等操作。
fs模块
fs模块是node.js实现与硬盘的交互的模块,用于文件管理,实现写入、读取、追加内容等操作。
文件写入
同步与异步的区别:
- 同步的执行顺序是: 从上到下的顺序,如果一个文件很大,那么他会等待这个文件执行完之后,在执行下面的代码
- 异步的执行顺序是: 执行一个很大的代码时 不会死等这个很大的代码执行完毕,会与其他小的文件一起执行
文件的异步写入 fs.writeFile(路径,内容,响应参数)
// 导入fs
const fs = require("fs");
// 写入文件
fs.writeFile("./book1.txt","鸡你太美", err => {
// 写入失败,失败对象 ;写入成功,null
if(err){
console.log("写入失败");
return
}
console.log("写入成功")
})
server.listen(9000, () =>{
console.log("成功")
})
文件的同步写入 fs.writeFileSync(路径,内容,响应参数)
// 导入fs
const fs = require("fs");
// 写入文件
fs.appendFile('./座右铭.txt','择其善者而从之,其不善者而改之。',
err => { if(err) throw err;
console.log('追加成功')
});
server.listen(9000, () =>{
console.log("成功")
})
文件的追加写入 appendFile / appendFileSync(路径,内容,响应参数):在文件尾部追加内容
// 导入fs
const fs = require("fs");
// 写入文件
fs.appendFile('./座右铭.txt','择其善者而从之,其不善者而改之。',
err => { if(err) throw err;
console.log('追加成功')
});
server.listen(9000, () =>{
console.log("成功")
})
流式写入 createWriteStream用于高频、持续写入数据
const fs = require("fs");
const ws = fs.createWriteStream("./坤曲.txt");
ws.write("姬霓太美\r\n");
ws.write("姬霓太美\r\n");
ws.write("多看一眼就会爆炸\r\n");
ws.write("多靠近一点就会融化\r\n");
ws.close();
server.listen(9000, () =>{
console.log("成功")
})
文件写入的应用场景:
- 下载文件、安装软件、保存日志、编辑器保存文件、视频录制等
- 实现数据的持久化保存需要考虑文件写入。
文件读取
异步读取:readFileSync
//导入 fs 模块
const fs = require('fs');
fs.readFile('./坤曲.txt', (err, data) => { if(err) throw err;
console.log(data);
});
fs.readFile('./坤曲.txt', 'utf-8',(err, data) => { if(err) throw err;
console.log(data);
});
同步读取:readFileSync
const fs = require("fs")
fs.readFileSync("./坤曲.txt",(err,data) => {
if (err){
console.log("读取失败");
return;
}
console.log(data.toString());
})
流式读取:createReadSteam,一块块读取数据
//创建读取流对象
let rs = fs.createReadStream('./观书有感.txt');
//每次取出 64k 数据后执行一次 data 回调
rs.on('data', data => {
console.log(data);
console.log(data.length);
});
//读取完毕后, 执行 end 回调
rs.on('end', () => {
console.log('读取完成')
})
复制项目1:
const fs = require("fs")
let data = fs.readFileSync("./资料/七里香.mp3")
fs.writeFileSync(
"./七里香.mp3",data, err => {
// 写入失败,失败对象 ;写入成功,null
if(err){
console.log("写入失败");
return
}
console.log("写入成功")
})
复制项目2:流式读取
const fs = require("fs")
const rs = fs.createReadStream("./资料/七里香.mp3")
const ws = fs.createWriteStream("./资料/七里香1.mp3")
rs.on("data",chunk => {
ws.write(chunk);
})
快捷写法:
const fs = require("fs")
const rs = fs.createReadStream("./资料/七里香.mp3")
const ws = fs.createWriteStream("./资料/七里香1.mp3")
rs.pipe(ws)
文件重命名和移动
const fs = require("fs")
fs.rename("./坤曲.txt","./只因你太美.txt",err => {
if (err){
console.log("读取失败");
return
}
console.log("成功");
})
删除文件
const fs = require("fs")
fs.unlink("./资料/七里香1.mp3",err => {
if (err){
console.log("删除失败");
return;
}
console.log("成功");
})
const fs = require("fs")
fs.rm("./资料/七里香1.mp3",err => {
if (err){
console.log("删除失败");
return;
}
console.log("成功");
})
文件夹操作
创建文件夹
异步方法:mkdir 同步方法:mkdirSync
const fs = require("fs")
fs.mkdir("./html",err => {
if (err){
console.log("失败");
return
}
console.log("成功");
})
递归 创建:设置参数{recursive:true}
const fs = require("fs")
fs.mkdir("./a/b/c",{recursive:true},err => {
if (err){
console.log("失败");
return
}
console.log("成功");
})
读取文件夹
const fs = require("fs")
fs.readdir("./a",{recursive:true},err => {
if (err){
console.log("失败");
return
}
console.log("成功");
})
查看资源状态:
const fs = require("fs")
fs.stat("./资料/七里香.mp3",(err,data) => {
if (err){
console.log("删除失败");
return;
}
console.log(data);
console.log(data.isFile());
console.log(data.isDirectory());
})
- __ dirname : 对象所在绝对路径
拆分:split(".")
const fs = require("fs")
const files = fs.readdirSync("./html/code")
// console.log(files)
files.forEach(
item => {
let data = item.split(".")
console.log(data)
}
)
案例
实现文件复制功能:
先用fs方法访问目标文件夹,forEach循环方法,读取文件。
const fs = require("fs")
const files = fs.readdirSync("./html/code")
files.forEach(item => {
let data = item.split(".")
let [num,name] = data
if (Number(num) < 10){
num = "0" + num
}
let newname = num + "." + name + ".js"
// console.log(newname)
fs.renameSync(`./html/code/${item}`,`./html/code/${newname}` )
})