目录
Nodejs
1、Nodejs简介
nodejs是什么
node.js就是一款应用程序,是一款软件,它可以运行JavaScript
nodejs的作用
- 开发服务器应用
- 开发工具类应用
- 开发桌面端应用
nodejs下载网址
nodejs入门编码注意事项
- Node.js中不能使用BOM和DOM的API,可以使用console和定时器API
- Node.js中的顶级对象为global,也可以是globalThis访问顶级对象
2、Buffer(缓冲器)
概念
Buffer是一个类似于数组的对象
,用于表示固定长度的字节序列
Buffer本质是一段内存空间,专门用来处理二进制数据
特点
- Buffer大小固定且无法调整
- Buffer性能较好,可以直接对计算机内存进行操作
- 每个元素的大小为1字节(byte)
创建
alloc
allocUnsafe
from
// alloc
let buf = Buffer.alloc(10);
// console.log(buf);
//allocUnsafe: 相对于alloc来说,unsafe不会清空旧数据,而alloc会清空旧数据返回0,但unsafe的处理速度更快
let buf2 = Buffer.allocUnsafe(10);
//from
let buf3 = Buffer.from('hello')
console.log(buf3);
Buffer与字符串的转化
我们可以借助toString
方法将Buffer转化为字符串
let buf4 = Buffer.from([105,108,111,118,101,121,111,117])
console.log(buf4.toString());//utf-8 输出:iloveyou
toString默认是按照
utf-8
编码方式进行转换的
Buffer 的读写
Buffer可以直接通过[]
的方式对数据进行处理
let buf5 = Buffer.from('loveyou')
console.log(buf5[0]);//108
console.log(buf5[0].toString(2));//转化为二进制
buf5[0]=95;
console.log(buf5.toString());//_oveyou
溢出
最高数为8为二进制位数 => 255(十进制) ,如果数高于255则会舍弃高位数字,如:
1011 1110 0011(输入) => 1110 0011(实际输出)
let buf6 = Buffer.from('hello')
buf6[0] = 261 //
console.log(buf6[0]);//5
中文
一个中文文字站位3个字符
let buf3 = Buffer.from('你好')
console.log(buf3);//<Buffer e4 bd a0 e5 a5 bd>
3、计算机基础流程
软件/系统启动流程
程序一般保存在硬盘中,软件安装的工程就是将程序写入硬盘的过程。
程序在运行时会加载进入内存,然后CPU读取并执行程序。
进程
进程是程序的一次执行过程
CPU跑内存中的程序
线程
线程是一个进程中执行的一个执行流
一个线程是属于某个进程的
4、fs API
fs模块可以实现与硬盘的交互,例如文件的创建、删除、重命名、移动,还有文件内容的写入、读取,以及文件夹的相关操作
写入文件
通过fs脚本创建并写入文件,这样可以实现自动化写入文件,而不是手动写入,提高效率
VScode的创建、写入文件底层逻辑也是利用fs模块
const fs = require('fs')
fs.writeFile('./demo2_.txt','demo2_text',err =>{
if(err){
//err写入失败返回:错误对象 写入成功返回:null
console.log('写入失败');
return;
}
console.log('写入成功');
})
同步和异步
writeFile
写入模式是异步的,err
回调函数会在主程序完成后才执行
writeFileSync
写入模式是同步,程序自上而下执行,会等待每一个程序执行完才进行下一条程序
fs.writeFileSync('./demo2_.txt','demo2_text')
appendFile/appendFileSync 追加写入
appendFile作用是在文件尾部追加内容,appendFile语法与writeFile语法完全相同
语法:
fs.appendFile(file,data[, opptions],callback)
fs.appendFileSync(file,data[, opptions])
const fs = require('fs');
fs.appendFile('./demo2_.txt',',追加text',err =>{
if(err){
console.log("追加失败");
}
console.log("追加成功");
fs.appendFileSync('./demo2_.txt','\r\n追加Synctext')
补充:
如果用writeFile
实现追加内容的话,会发现writeFile
会删除旧数据,不会追加,则需要{flag:'a'}
fs.writeFile('./demo2_.txt',',追加Writetext',{flag:'a'},err =>{
if(err){
console.log('写入失败');
}
console.log('写入成功');
})
createWtiteStream流式写入
语法:fs.createWriteStream(path[, options])
参数说明:
- path 文件路径
- options 选项配置
const fs = require('fs')
let ws = fs.createWriteStream('demo4.txt')
ws.write('demo4')
//ws.close()可写可不写,会自动回收断开流
ws.close();
程序打开一个文件是需要消耗资源的,流式写入可以减少打开关闭文件的次数
流式写入方式适用于
大文件写入或者频繁写入
的场景,writeFile
适合于写入频率较低的场景
文件读取
方法 | 说明 |
---|---|
readFile | 异步读取 |
readFileSync | 同步读取 |
createReadStream | 流式读取 |
fs.readFile('./demo2_.txt',(err,data) =>{
if(err){
console.log("defeat");
}
console.log(data.toString());
})
const data = fs.readFileSync('./demo2_.txt')
console.log(data.toString());
let rs = fs.createReadStream('./demo2_.txt')
rs.on('open',()=>{
console.log("open");
})
rs.on('data',(data)=>{
console.log(data.toString());
})
测试:文件复制
const fs = require('fs')
const process = require('process')
let data = fs.readFileSync('./demo4.txt');
let cv = fs.writeFileSync('./demo6.txt',data);
console.log(process.memoryUsage()); //rss: 31195136
<!-- 流式复制 -->
const rs = fs.createReadStream('./demo4.txt')
const ws = fs.createWriteStream('./demo6.txt')
rs.on('data',chunk =>{
ws.write(chunk);
})
rs.on('end',() =>{
console.log(process.memoryUsage()); //rss: 31502336
})
一般来说,流式复制会占用更少的内存处理数据,所以一般使用流式
简化rs.on('data',..)
与rs.on('end',..)
:
rs.pipe(ws)
文件移动与重命名
我们可以使用raname
或者renameSync
来移动或重命名文件或文件夹
语法:
fs.rename(oldPath,newPath,callback)
fs.renameSync(oldPath,newPath)
fs.rename('demo4.txt','demo4_new.txt',err =>{
if(err){
console.log("defeat");
}
console.log('success!');
})
文件删除
我们可以使用unlink
和unlinkSync
或者rm
和rmSync
来删除文件或文件夹
fs.unlink('demo6.txt',err =>{
if(err){
console.log('fail');
}
console.log('success');
})
fs.rm('demo4_new.txt',err =>{
if(err){
console.log('fail');
}
console.log('success');
})
文件夹操作
借助Node.js的能力,可以对文件夹进行创建
、读取
、删除
等操作
方法 | 说明 |
---|---|
mkdir | 创建文件夹 |
readdir | 读取文件夹 |
rmdir/rm | 删除文件夹 |
const fs = require('fs')
//创建文件夹
fs.mkdir('test',err=>{
if(err){
console.log('fail');
}
console.log('success');
})
//创建多级文件夹
fs.mkdir('a/b/c',{recursive:true},err=>{
if(err){
console.log('fail');
}
console.log('success');
})
//读取文件夹
fs.readdir('../NODEJS学习',(err,data)=>{
if(err){
console.log('fail');
}
console.log(data);
})
//删除文件夹
fs.rmdir('test',err=>{
if(err){
console.log('fail');
}
console.log('success');
})
//删除多级文件夹
fs.rm('a',{recursive:true},err=>{
if(err){
console.log('fail');
}
console.log('success');
})
查看资源状态
可以利用stat
来查看资源的信息
const fs = require('fs')
fs.stat('./demo.js',(err,data)=>{
if(err){
console.log('fail');
return;
}
console.log(data);
//isFile 判断是不是文件
//isDiretory 判断是不是文件夹
console.log(data.isDirectory);
})
fs模块路径说明
相对路径BUG及解决
在node里面写的相对路径执行参照物:命令行的工作目录
所以这样不能准确定位到你想要的目录下,会随着命令行的工作目录改变
<!-- demo10.js -->
const fs = require('fs')
//相对路径模式 ./ 当前目录下
fs.writeFileSync('./10.text','test')
终端:
D:\md文件\nodejs学习> node .\demo10.js
会创建在nodejs学习
目录下
D:\md文件\nodejs学习\a> node ..\demo10.js
会创建在a
目录下
解决方法:换绝对路径
'全局变量'
:__dirname
可以定位当前目录的绝对路径
console.log(__dirname); //D:\md文件\nodejs学习
const fs = require('fs')
fs.writeFileSync(__dirname+'/10.text','test')