cnpm(淘宝npm镜像)
npm太慢,可以使用国内淘宝镜像
通过cnpm命令进行使用
npm install -g cnpm --registry=http://registry.npm.taobao.org
同时npm也可以使用
node搜索包的流程
通过npm下载的包都放到了node_modules文件夹中,如果要引入我们通过npm下载的包,直接通过包名引入即可。
node在使用模块名字来引入模块时,它会首先在当前目录的node_modules中寻找是都含有该模块,如果有则直接使用,如果没有则去上一级目录的node_modules中寻找,直到找到为止。如果直到找到磁盘的根目录依旧没有找到,则报错。
Buffer缓冲区
Buffer的结构和操作方法与数组类似
数组中不能用来存储二进制的文件,而Buffer就是专门用来存储二进制数据
使用Buffer不需要引入模块,直接使用即可
var buf = Buffer.from(str); //将一个字符串保存在Buffer中
在Buffer中存储的都是二进制数据,但是在显示时都是以16进制的形式显示的
Buffer中每一个元素的范围是从00 - ff(00000000 - 11111111)即一个字节
创建一个指定字节的Buffer。Buffer的大小一旦确定,则不能修改。因为Buffer实际上是对底层内存的直接操作
var buf2 = Buffer.alloc(10);//创建了一个10字节的Buffer
var buf3 = Buffer.allocUnsafe(10); //创建一个指定大小的Buffer,但是Buffer中可能含有敏感数据。
//也就是说输出值可能不是<Buffer 00 00 00 00 00 00 00 00 00 00>,而是会有之前存储的一些数据
通过索引,来操作buf2中的元素
buf2[0] = 10; //十进制
buf2[1] = 0xaa; //十六进制
buf2[2] = 586; //实际显示4A,只取后八位
//10 0100 1010
// 0100 1010
console.log(buf2[1].toString(16)); //只要是数字在控制台或页面中输出一定是十进制,toString()规定以几进制进行输出;这句话的意思是将buf2[1]的值以十六进制的形式输出
将一个字符串转换为Buffer
var buf3 = from(str); //将一个字符串转换为Buffer
console.log(buf3.toString());//buf.toString() 将缓冲区中的数据转换为字符。
文件写入
同步文件写入
fs(文件系统)-File System
文件系统简单来说就是通过Node来操作系统中的文件。Node通过fs模块来和文件系统进行交互,该模块提供了一些标准文件访问API来打开、读取、写入文件,以及与其交互。
使用文件系统,需要先引入fs模块,fs是核心模块,直接引入不需要下载
同步和异步调用
- fs模块中所有的操作都有两种形式可供选择:同步和异步
- 同步文件系统会阻塞程序的执行,有人就是除非操作完毕,否则不会向下执行代码
- 异步文件系统不会阻塞程序的执行,而是在操作完成时,通过回调函数将结果返回
fs.close(fd,callback) //异步
fs.closeSync(fd) //同步
文件的写入
1.打开文件
fs.openSync(path[, flags, mode])
//path 要打开文件的路径
//flags 要打开文件要做的操作的类型 r:只读的 w:可写的
//mode 设置文件的操作权限,一般不传
eg:fs.openSync("hello.txt","w");
返回值:该方法会返回一个文件的描述符作为结果,我们可以通过该描述符来对文件进行各种操作
2.向文件中写入内容
fs.writeSync(fd, string[, position[, encoding]])
//fd 文件的描述符,需要传递要写入的文件的描述符
//string 要写入的内容
//position 写入的起始位置
//encoding 写入的编码,默认utf-8
eg: fs.writeSync(fd,"寄一笔春夏");
3.保存并关闭
fs.closeSync(fd)
//fd 要关闭的文件的描述符
只要有返回值一定是同步
异步文件写入
1.打开文件
fs.open(path[, flags[, mode]], callback)
//callback 回调函数
//异步调用的方法,结果都是通过回调函数的参数返回的
//回调函数有两个参数:error-错误对象,如果没有错误则返回NULL fd:文件的描述符
2.向文件中写入内容
fs.write(fd, string[, position[, encoding]], callback)
3.保存并关闭
fs.close(fd,callback)
举例:
var fs = require("fs");
var f;
//打开文件
fs.open("hello2.txt","w",function(err,fd){
//判断是否出错
if(!err){
//如果没有出错,则对文件进行写入操作
fs.write(fd,"述一集桃雾",function (){
if(!err){
console.log("写入成功~");
}
//关闭文件
fs.close(fd,function (err){
if(!err){
console.log("文件已关闭~");
}
})
})
}else{
console.log(err);
}
});
简单文件写入
fs.writeFile(file, data[, options], callback)
fs.writeFileSync(file, data[, options])
//file 要操作的文件的路径
//data 要写入的数据
//options 选项,可以对写入进行一些设置
//callback 当写入完成以后执行的函数
eg:
var fs = require("fs");
fs.writeFile("hello3.txt","想养一只昆仑",function (err){
if(!err)
{
console.log("写入成功~");
}else{
console.log(err);
}
});
想要在原文件中添加新内容
var fs = require("fs");
//如果是要添加绝对路径的话,需要写成:C:\\Users\\DELL\\Desktop\\hello.txt (只写一个\会对后面的字母进行转义)
//也可以写成C:/Users/DELL/Desktop/hello.txt
fs.writeFile("hello3.txt","想养一只昆仑",{flag:"a"},function (err){ //flag对应的值可根据一下打开状态进行修改
if(!err)
{
console.log("写入成功~");
}else{
console.log(err);
}
});
打开状态
模式 | 说明 |
---|---|
r | 读取文件,文件不存在则出现异常 |
r+ | 读写文件,文件不存在则出现异常 |
rs | 在同步模式下打开文件用于读取 |
rs+ | 在同步模式下打开文件用于读写 |
w | 打开文件用于写操作,如果不存在则创建,如果存在则截断 |
ws | 打开文件用于写操作,如果存在则打开失败 |
w+ | 打开文件用于读写,如果不存在则创建,如果存在则截断 |
wx+ | 打开文件用于读写,如果存在则打开失败 |
a | 打开文件用于追加,如果不存在则创建 |
ax | 打开文件用于追加,如果路径存在则失败 |
a+ | 打开文件进行读取和追加,如果不存在则创建改文件 |
ax | 打开文件进行读取和追加,如果路径存在则失败 |
流式文件写入
同步、异步、简单文件的写入都不适合大文件的写入,性能较差,容易导致内存溢出
流式文件写入适用于一些比较大的文件,可以分多次写入到文件中
创建一个可写流
fs.createWriteStream(path[, options])
//path 文件路径
//options 配置的参数
eg:var ws = fs.createWriteStream("hello4.txt");
向文件中写入
ws.write("种自己的花");
ws.write("爱自己的宇宙");
//可无限添加
可以通过监听流的open和close事件来监听流的打开和关闭
//打开
ws.once("open",function (){
console.log("已经打开流~");
}) //on绑定的是长期事件 once绑定的是一次性事件,该事件会在触发一次之后自动失效
//关闭
ws.once("close",function (){
console.log("已经打开流~");
})
关闭流
ws.end();
//ws.close()可能因为版本问题,我可以通过这个代码实现内容全传入后再关闭
文件读取
同步文件读取
fs.readSync(fd, buffer, [options])
异步文件读取
fs.read(fd, [options,] callback)
简单文件读取
fs.readFile(path[, options], callback)
fs.readFileSync(path[, options])
举例:
fs.readFile("hello3.txt",function (err,data){
if(!err)
{
//console.log(data.toString());
console.log(data); //得到的值是Buffer,适用于各种类型的文件
}
});
读取文件后将文件内容写入到另一个文件中
var fs = require("fs");
var path = "C:/Users/DELL/Desktop/111.jpg";
fs.readFile(path,function (err,data){
if(!err)
{
//console.log(data.toString());
//console.log(data);
fs.writeFile("222.jpg",data,function (){
if (!err){
console.log("写入成功~");
}
})
}
});
流式文件读取
如果要读取一个可读流中的数据,必须要为可读流绑定一个data事件,data事件绑定完毕,它会自动开始读取数据
逻辑写法:
var fs =require("fs");
var rs = fs.createReadStream("222.jpg");
var ws = fs.createWriteStream("333.jpg");
rs.once("open",function (){
console.log("打开了可读流~");
})
rs.once("close",function (){
console.log("关闭了可读流~");
//读取数据结束,关闭可写流
ws.end();
})
ws.once("open",function (){
console.log("打开了可写流~");
})
ws.once("close",function (){
console.log("关闭了可写流~");
})
rs.on("data",function (data){
//console.log(data);
ws.write(data);
});
pipe()可以将可读流中的内容,直接输出到可写流中
利用pipe()写
var fs =require("fs");
var rs = fs.createReadStream("222.jpg");
var ws = fs.createWriteStream("444.jpg");
rs.pipe(ws);
其他操作
- 验证路径是否存在 fs.existsSync(path)
- 获取文件信息 fs.stat(path[, options], callback)/fs.statSync(path[, options])
- 删除文件 fs.unlink(path, callback)/fs.unlinkSync(path)
注:学习参考来源b站【尚硅谷】最经典Node.js全套完整版教程(超哥yyds!!!!)