Nodejs学习1(Buffer、fs模块)

Nodejs

1、Nodejs简介

nodejs是什么

node.js就是一款应用程序,是一款软件,它可以运行JavaScript

nodejs的作用
  • 开发服务器应用
  • 开发工具类应用
  • 开发桌面端应用
nodejs下载网址

Node.js (nodejs.org)

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!');
})
文件删除

我们可以使用unlinkunlinkSync或者rmrmSync来删除文件或文件夹

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')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海量的海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值