文章目录
- Node.js中可以使用BOM和DOM的API,可以使用console和定时器API
- Node.js的顶级对象global,也可以用globalThis访问顶级对象
1. Buffer
Buffer中文译为[缓冲区],是一个类似于Array 的对象,用于表示固定长度的字节序列(换句话说,Buffer就是一段固定长度的内存空间,用于处理二进制数据)
Buffer介绍与创建
Node.js中创建Buffer的方式主要如下几种:
1.Buffer.alloc
//创建了一个长度为10字节的Buffer,相当于申请了10字节的内存空间,每个字节的值为0
let buf_1=Buffer.alloc(10);//结果为<Buffer 00000000000000000000>
2.Buffer.allocUnsafe
//创建了一个长度为10字节的Buffer, buffer中可能存在旧的数据,可能会影响执行结果,所以叫 unsafelet
buf_2=Buffer.allocUnsafe(10);
3.Buffer.from
//通过字符串创建Buffer
let buf_3=Buffer.from( 'hello');
//通过数组创建Buffer
//十进制转化为二进制给机器看,在终端显示的是十六进制方便人看
let buf_4=Buffer.from([105,108,111,118,101, 121, 111,117]);
Buffer与字符串的转化
可以借助toString方法将Buffer转为字符串
let buf_4=Buffer.from([105,108,111,118,101,121,111,117]);
console.log(buf_4.toString());//utf-8
//结果是iloveyou
let buf=Buffer.from('hello');
console.log(buf[0].toString(2));//查看底层二进制
toString默认是按照utf-8编码方式进行转换的。
Buffer的读写
Buffer可以直接通过[ ]的方式对数据进行处理。
//读取
console.log(buf_3[1]);
//修改
buf_3[1]=97;
//查看字符串结果
console.log(buf_3.toString());//aello
注意:
1.如果修改的数值超过255,则超过8位数据会被舍弃
2.一个utf-8的字符一般占3个字节
2. 计算机基础
基本组成:CPU,内存,硬盘
程序一般保存在硬盘中,软件安装的过程就是将程序写入硬盘的过程。
程序在运行时会加载进入内存,然后由CPU读取并执行程序
进程和线程;进程包含线程
3. fs模块
fs(文件系统)fs模块可以实现与硬盘的交互 例如文件的创建、删除、重命名、移动,还有文件内容的写入、读取,以及文件夹的相关操作
操作fs时一定要有引入fs模块
fs文件写入
fs异步与同步
// 1.导入fs模块
const fs=require('fs');
// 2.写入文件
fs.writeFile('./座右铭.txt','三人行必有我师焉',err=>{
// err写入失败:错误对象,写入成功:null
if(err){
console.log("写入失败");
return;
}
console.log("写入成功");
})
console.log(1+1)
//从上而下执行代码时异步写入会先不执行回调函数,先执行下面的代码,因此先输出console.log(1+1)再输出回调函数
同步写入:fs.writeFileSync(‘/data.txt’,‘test’);
fs的追加写入
\r\n换行
// 1.导入fs模块
const fs=require('fs');
// 2.调用appendFile
fs.appendFile('./座右铭.txt','\r\n择其善者而从之。。。',err=>{
if(err){
console.log("写入失败");
return;
}
console.log("写入成功");
});
流式写入creatWriteStream()
文件写入场景
文件读取
读取文件应用场景·电脑开机·程序运行·编辑器打开文件·查看图片·播放视频·播放音乐·Git查看日志·上传文件·查看聊天记录等
异步同步读取
选项配置是可选参数,其他两个必选
// 异步读取
fs.readFile('./座右铭.txt',(err,data)=>{
if(err){
console.log("读取失败");
return;
}
// 不转化为字符串终端现实的是Buffer形式
console.log(data.toString());
})
// 同步读取
let data = fs.readFileSync('./座右铭.txt');
console.log(data.toString());
流式读取
// 1.导入fs模块
const fs=require('fs');
// 2.创建读取流对象
const rs=fs.createReadStream('../资料/笑看风云.mp4');
// 3.绑定data流事件 用于获取读取到的数据 chunk块
rs.on('data',chunk=>{
// console.log(chunk);
console.log(chunk.length);//65536字节=>64KB 流式读取每一次读取64KB字节
})
// 4. end 可选事件 处理大文件时能提高效率
rs.on('end',()=>{
console.log('读取完成');
})
复制
//方式一readFile
//读取文件内容
let data =fs.readFilesync('./资料/笑看风云.mp4');
//写入文件
fs.writeFileSync("./资料/笑看风云-2.mp4",data);
//方式二流式操作(占用内存相对较少)
//创建读取流对象
const rs=fs.createReadstream("./资料/笑看风云.mp4');
//创建写入流对象
const WS=fs.createwritestream('.:/资料/笑看风云-3.mp4');
//绑定data事件
rs.on('data',chunk =>{
Ws.write(chunk);
);
//绑定data事件简便操作
rs.pipe(ws);
文件重命名与移动
文件删除
在Node.js中,我们可以使用unlink
或unlinkSync
来删除文件
语法:
fs.ulink(path, callback)
fs.unlinkSync(path)
参数说明:
path文件路径·
callback操作后的回调
代码示例:
1.调用fs
const fs =require('fs');
2.调用unlink方法
fs.unlink('./test.txt',err=>{
if(err)throw err;
console. log(删除成功);
);
fs.unlinkSync(./test2.txt');
//调用rm方法14.4 rmSync
fs.rm('./论语.txt",err =>{
if(err){
console.log(’删除失败~');
return;
}
console.log('删除成功');
})
文件夹操作
//{recursive:true}递归创建嵌套文件夹
fs.mkdir('./a/b/c',{recursive:true},err=>{
if(err){
console.log("失败");
return;
}
console.log("成功");
});
不推荐使用rmdir推荐使用rm
查看资源状态
fs路径
相对路径bug:
相对路径参照物:命令行的工作目录
//绝对路径 '全局变量(不是真正意义上的)',保存的是文件所在目录的绝对路径
console.log(_dirname)
fs.writeFilesync(_dirname+'/index.html','love');
//!!不是./
重命名练习
文件上传网盘序列先排列0开头的再排列1开头的,可以在个位数的文件前加’0‘来解决:
const fs=require('fs');
// 读取code文件
const files=fs.readdirSync('./code1');
// 遍历数组
files.forEach(item=>{
// 拆分文件名
let data=item.split('-');
let [num,name]=data;
// 判断
if(Number(num)<10){
num='0'+num;
}
// 创建新文件
let newName=num+'-'+name;
fs.renameSync(`./code1/${item}`,`./code1/${newName}`);
})
4. path模块
// resolve 解决 补全路径
console.log(path.resolve(__dirname,'./index.html'));// ./可以不写
console.log(path.resolve(__dirname,'/index.html'));//D:/index.html
console.log(path.resolve(__dirname,'/index.html','./test'));//后面会跟一个相对路径 进行拼接 D:/index.html/test