目录
Node Js
Buffer (缓冲区)
概念
buffer[缓冲区] ,是一个类似于数组的对象,是一段固定长度的内存空间,用于处理二进制数据。
特点
- Buffer大小固定且无法更改
- Buffer性能较好,直接对计算机内存
- 每个元素的大小为一个字节 ( byte)
使用
- 创建Buffer
alloc方法
let buf = Buffer.alloc(10)
使用alloc方法创建的Buffer每一个二进制位都为00
<Buffer 00 00 00 00 00 00 00 00 00 00>
allocUnsafe方法
let buf_2 = Buufer.allocUnsafe(10)
使用alloc方法创建的Buffer==其中可能包含旧的内存数据
<Buffer 01 10 11 22 33 66 00 00 00 00>
优点: 比alloc快一点 缺点:比alloc危险
from方法
let buf_3 = Buffer.from('hello')
<Buffer 68 65 6c 6c 6f>
此处的HELLO中的 H对应的是 68 ,原因是H的ASCii码是104(十进制),104 转换成 16进制 变成了 68
- Buffer与字符串的转换
toString方法
let buf_4 = Buffer.from([105,108,111,118,101,121,111,117]) console.log(buf_4.toString())
buffer不使用tostring,只会把16进制转为10进制,但使用了tostring就会多加一步,从十进制通过ascii转为字符
toString()是转换字符串,toString (2)是转化为2进制,尤其注意!!!!
- graph LR A[16进制] -->B(10进制) B-->|toString|D[字符串]
- Buffer的读写
[]方式
读取
buf_3[1]
修改
buf_3[1] = 97
ps:1. 如果一个修改的数值超过255(10进制),则其超过八位数据会舍弃(一个十六进制数对应8位二进制,8为二进制上限表示十进制255)
2.一个utf-8字符一般占3个字节
let buf -Buffer.from('你好') <Buffer e4 bd a0 e5 e5 bd>//这里之所以只有6个16进制是因为一个中文对应三个位置 ```
计算机基础
进程与线程
程序的运行就是一个进程,线程是一个进程中执行的执行流,一个进程有多个线程,不存在属于进程的线程
就好比:蜜雪冰城门店(进程)是由多个员工(线程)一起干活,每个员工干不同的活
fs模块
实现与硬盘的交互,例如文件的创建,删除,重命名,移动,文件内容的写入读取,文件夹的操作
写入文件
① .writeFile 异步写入
语法:
fs.writeFile(file,data[ , options],callback)
参数说明:
- file 文件名
- data 待写入的数据
- options 选项设置(可选) ==> ① {flag: ‘a’} 追加写入
- callback 写入回调
返回值:undefined
需求:新建一个文件”座右铭.txt”写入内容,三人行,必有我师
1.导入fs模块 const fs = require('fs'); 2.写入文件 fs.writefile("./座右铭.txt','三人行,必有我师',err => { if(err){//err值有两种情况,写入成功为null,写入失败为提示失败原因 console.log('写入失败') return } console.log('写入成功') })
② .writeFileSync 同步写入
语法:
fs.writeFileSync(file,data[ , options])
参数说明:
- file 文件名
- data 待写入的数据
- options 选项设置(可选)
需求:新建一个文件”座右铭.txt”写入内容,三人行,必有我师
1.导入fs模块 const fs = require('fs'); 2.写入文件 fs.writefileSync("./座右铭.txt','三人行,必有我师')
③ .appendFile/appendFileSync 追加写入
功能:appendFile实在文件尾部追加内容
语法:
fs.appendFile(file,data[ , options],callback)
fs.appendFileSync(file,data[ , options])
返回值:二者都为undefined
实例代码:
异步
const fs = require('fs') fs.appendFile('./座右铭.txt',',择期善者而从之,择期不善者而改之',err => { if(err){ console.log('写入失败~~') return; } console.log('追加写入成功') })
同步
fs.appendFileSync('./座右铭.txt','/r/n温故而知新,可以为师矣')
④ .createWriteStream 流式写入
语法:
fs.createWriteStream(path[ , options])
参数说明:
- path 文件路径
- options 选项配置(
可选
)
返回值:
Object
代码示例:
const fs = require('fs') // 创建写入流对象 const ws = fs.createWriteStream('./观书有感.txt'); //write ws.write('a') ws.write('b') ws.write('c') //关闭通道 ws.close() or ws.end()
程序打开一个文件是需要消耗资源的,流式写入可以减少打开文件的次数. 流式写入方式适用于大文件写入或者频繁写入的场景,writeFile适合于写入频率较低的场景
需要写入文件的场景
当需要持久化保存数据的时候,应该想到文件写入
- 下载文件
- 安装软件
- 保存文件日志,如git
文件读取
①.readFile 异步读取
语法:
fs.readFile(path[ , options], callback)
参数说明:
- path 文件路径
- options 选项配置
- callback 回调函数
返回值: undefined
代码示例:
const fs = require('fs'); fs.readFile('./观书有感.txt',(err,data)=>{ if(err){ console.log('读取失败') return; } console.log(data.toString());//不加toString读取出来的是buffer })
②.readFileSync 同步读取
语法:
fs.readFile(path[ , options])
参数说明:
- path 文件路径
- options 选项配置
返回值: undefined
代码示例:
let data = fs.readFileSync('./观书有感.txt') console.log(data)
③.createReadStream 流式读取
const fs = require ('fs') 1.创建读取流对象 const rs = fs.createReadStream('../资料/笑看风云.mp4') 2.绑定data事件 chunk == 数据块 rs.on('data',chunk =>{ console.log(chunk);//输出为buff }) 3. end 可选事件 rs.on('end'),()=>{ console.log('读取完成') })
读取文件应用场景
- 电脑开机
- 程序运行
- 编辑器打开文件
- 查看图片
- 播放视频
- 播放音乐
- git查看日志
- 上传文件
- 查看聊天记录
文件移动与重命名
语法:
fs.rename(oldpath,newpath,callback)
fs.renameSync(oldPath,newPath)
参数说明:
- oldPath 文件当前路径
- newPath 文件新的路径
- callback 操作后的回调
代码示例:
const fs =require('fs') //移动文件 fs.rename('./观书有感.txt','./论语/观书有感.txt',(err) =>{ if(err) throw err; console.log('移动完成') }) fs.renameSync('./观书有感.txt','./论语/观书有感.txt') //重命名文件 fs.rename('./座右铭.txt','./论语.txt',(err) =>{ if(err) throw err; console.log('移动完成') }) fs.renameSync('./座右铭.txt','./论语.txt')
文件删除
①unlink 法
语法:
fs.unlink(path , callback)
fs.unlinkSync(path)
参数说明:
- path 文件路径
- callback 操作后的回调
代码示例:
const fs = require('fs') //异步 fs.unlink('./test.txt',err =>{ if(err) throw err; console.log('删除成功') }) //同步 fs.unlinkSync('./test2.txt')
② rm法
语法: ·
fs.rm(path , callback)
fs.rmSync(path)
参数说明:
- path 文件路径
- callback 操作后的回调
代码示例:
const fs = require('fs') //异步 fs.rm('./test.txt',err =>{ if(err) throw err; console.log('删除成功') }) //同步 fs.rmSync('./test2.txt')
文件夹操作
包含文件夹创建、删除、读取
语法:
方法 语法 创建文件夹 mkdir / mkdirSync 读取文件夹 readdir / readdirSync 删除文件夹 rmdir / rmdirSync 创建文件夹
①普通创建
const fs =require ('fs') fs.mkdir('./html',err=>{ if(err){ console.log('创建失败') } console.log('创建成功') })
②递归创建
const fs =require ('fs') fs.mkdir('./a/b/c',{recursive: true},err=>{ //{recursive: true}递归创建的设置 if(err){ console.log('创建失败') } console.log('创建成功') })
读取文件夹
const fs =require ('fs') 读取文件夹 fs.readdir('../资源',(err,data)=>{ if(err){ console.log('读取失败') return;} console.log(data) })
删除文件夹
①单个删除
const fs =require ('fs') 删除文件夹 fs.rmdir('./html', err=>{ if(err){ console.log('删除失败') return } console.log('删除成功') } )
②递归删除
//不推荐使用↓
const fs =require ('fs') 删除文件夹 fs.rmdir('./a', {recursive:true},err=>{ if(err){ console.log('删除失败') return } console.log('删除成功') } )
//推荐使用↓
const fs =require ('fs') 删除文件夹 fs.rm('./a', {recursive:true},err=>{ if(err){ console.log('删除失败') return } console.log('删除成功') } )
查看资源状态
语法:
fs.stat(path[ ,options],callback)
fs.statSync(path[ ,options])
参数说明:
- path 文件夹路径
- options 选项配置
- callback 操作后的回调
示例代码:
//异步 fs.stat('./data.txt',(err,data) =>{ if(err) throw err; console.log(data); })
//同步 let data = fs.statSync('./data.txt');
PS: 目标.isFile可以查看目标是否为文件
目标==.isDirectory==可以查看目标是否为文件夹
相对路径与绝对路径补充说明
- 相对路径
./座右铭.txt
当前目录下的座右铭.txt座右铭.txt
等效于上面的写法../座右铭.txt
当前目录的上一级目录中的座右铭.txt- 绝对路径
D:/Program Files
windows系统下的绝对路径/user/bin
linux系统下的绝对路径相对路径中所谓的当前目录,指的是命令行的工作目录,而非是文件的所在目录
所以当命令行的工作目录与文件所在目录不一致时,会出现一些bug
如下
标签:fs,http,NodeJs,require,笔记,console,学习,const,response From: https://www.cnblogs.com/Agnoi/p/17896774.html