Node
Buffer(缓冲区)
-
Buffer的结构和数组很像,操作的方法也和数组类似
数组不能存储二进制文件,而buffer就是专门用来存储二进制文件
使用buffer不需要引入模块,直接使用即可
在buffer中存储的都是二进制数据,但是在显示时都是以16进制显示
buffer中每一个元素的范围是从00 - ff 0 - 255
00000000 - 11111111计算机 一个0 或一个1 我们称为1位(bit)
8bit=1Byte(字节)
1024byte=1KB
1024KB=1MB
1024MB=1GB
1024GB=1TB
buffer中的一个元素占用内存的一个字节
Buffer的大小一旦确定,则不能修改,Buffer实际上是对底层内存的直接操作 -
Buffer.from(str) 将一个字符串转换为buffer
-
var str="Hello 雪风"; //将一个字符串保存到buffer中 var buf=Buffer.from(str); console.log(buf.length);//12 占用内存的大小 console.log(str.length);//8 字符串的长度 console.log(buf);//<Buffer 48 65 6c 6c 6f 20 e9 9b aa e9 a3 8e>
-
-
Buffer.alloc(size) 创建一个指定大小的Buffer
-
/创建一个指定大小的buffer //buffer的构造函数都是不推荐使用的(new Buffer) //var buf2=new Buffer(1024);//1024个字节 1KB 的buffer var buf2=Buffer.alloc(10); //通过索引来操作buf中的元素 buf2[0]=255; buf2[1]=0xaa; buf2[2]=556;//最大保存为255 556二进制1000101100 //<Buffer ff aa 2c 00 00 00 00 00 00 00> 2c的十进制为00101100 明显超过范围只取二进制后八位 console.log(buf2); //只要数字在控制台或页面中输出一定是10进制 console.log(buf2[1]);//170 console.log(buf2[1].toString(16));//但是字母可以指定在控制台显示的进制 for(var i=0;i<buf2.length;i++){ console.log(buf2[i]); }//buffer遍历和数组遍历一样
-
-
Buffer.alloUnsafe(size) 创建一个指定大小的Buffer,但是可能包含敏感数据
-
//Buffer.allocUnsafe(size) 创建一个指定大小的buffer,但是buffer中可能含有敏感数据 /*var buf3 = Buffer.allocUnsafe(10); console.log(buf3);*/
-
-
Buffer.toString() 将缓冲区中的数据转换为字符串
-
var buf4 = Buffer.from("我是一段文本数据"); console.log(buf4.toString());//我是一段文本数据
-
文件系统(File System)
-
文件系统简单来说就是通过Node来操作系统中的文件
-
使用文件系统,需要先引入fs模块,fs是核心模块,直接引入不需要下载
同步文件的写入
手动操作的步骤
1.打开文件
fs.openSync(path, flags[, mode]) path 要打开文件的路径
flags 打开文件要做的操作的类型
r 只读的
w 可写的 mode 设置文件的操作权限,一般不传
返回值: 该方法会返回一个文件的描述符作为结果,我们可以通过该描述符来对文件进行各种操作
2.向文件中写入内容
fs.writeSync(fd, string[, position[, encoding]]) fd 文件的描述符,需要传递要写入的文件的描述符
string 要写入的内容
position 写入的起始位置
encoding 写入的编码,默认utf-8
3.保存并关闭文件
fs.closeSync(fd) fd 要关闭的文件的描述符
var fs=require("fs"); var fd=fs.openSync("text.txt","w"); fs.writeSync(fd,"雪风",0); fs.closeSync(fd); //Process finished with exit code 0代表成功运行
异步文件写入
-
//引入fs模块 var fs=require("fs"); var f; //打开文件 异步文件打开,回调函数不能省略 fs.open("text2.txt","w",function (err,fd) { //判断是否出错 if(!err){ f=fd; }else{ console.log(err); } }); console.log("open下的代码先执行,异步文件写入不会阻塞下面的代码,回调函数交给I/O执行");
-
方法
fs.open(path, flags[, mode], callback) 用来打开一个文件
异步调用的方法,结果都是通过回调函数的参数返回的 回调函数两个参数:
err 错误对象,如果没有错误则为null
fd 文件的描述符
fs.write(fd, string[, position[, encoding]], callback) 用来异步写入一个文件
fs.close(fd, callback)
用来关闭文件 -
//引入fs模块 var fs=require("fs"); //打开文件 异步文件打开,回调函数不能省略 fs.open("text2.txt","w",function (err , fd) { //判断是否出错 if(!err){ //如果没有出错,则对文件进行写入操作 fs.write(fd,"这是异步写入的内容",function (err) { if(!err){ console.log("写入成功~~"); } //关闭文件 fs.close(fd , function (err) { if(!err){ console.log("文件已关闭~~~"); } }); }); }else{ console.log(err); } }); console.log("open下的代码先执行,异步文件写入不会阻塞下面的代码,回调函数交给I/O执行");
打开状态
简单文件写入
简单文件写入
fs.writeFile(file, data[, options], callback)
fs.writeFileSync(file, data[, options])
file 要操作的文件的路径
data 要写入的数据
options 选项,可以对写入进行一些设置
callback 当写入完成以后执行的函数 flag
r 只读
w 可写
a 追加var fs=require("fs"); //F:\WebStorm-workspace\node\02.文件系统\hello.txt //F:/WebStorm-workspace/node/02.文件系统/hello.txt fs.writeFile("F:/WebStorm-workspace/node/02.文件系统/hello.txt","这是通过writeFile写入的内容",{flag:"w"} , function (err) { if(!err){ console.log("写入成功~~~"); }else{ console.log(err); } });
-
流式文件写入
应用背景: 同步、异步、简单文件的写入都不适合大文件的写入,性能较差,容易导致内存溢出
-
fs.createWriteStream(path[, options])
可以用来创建一个可写流
path,文件路径
options 配置的参数-
on(事件字符串,回调函数)
可以为对象绑定一个事件 -
once(事件字符串,回调函数)
可以为对象绑定一个一次性的事件,该事件将会在触发一次以后自动失效
//流式文件写入 //创建一个可写流 var fs = require("fs"); var ws = fs.createWriteStream("F:/WebStorm-workspace/node/02.文件系统/hello2.txt"); ws.once("open",function () { console.log("流打开了~~~"); }); ws.once("close",function () { console.log("流关闭了~~~"); }); //通过ws向文件中输出内容 ws.write("通过可写流写入文件的内容"); ws.write("今天天气真不错"); ws.write("锄禾日当午"); ws.write("红掌拨清清"); ws.write("清清真漂亮"); //关闭流 这里不能用ws.close(); close代表的是从A往B里刚传第一个内容后,就在B中把传输线给剪短了,这样的话文件传输不全的 //用end的话 就代表当A中所有内容传输完毕后,在A中把传输线给剪了,这样传输内容能保证全运输过去 ws.end();
-
文件的读取
1.同步文件读取
2.异步文件读取
3.简单文件读取
fs.readFile(path[, options], callback)
fs.readFileSync(path[, options])
path 要读取的文件的路径
options 读取的选项
callback回调函数,通过回调函数将读取到内容返回(err , data)
err 错误对象
data 读取到的数据,会返回一个Buffer
var fs = require("fs");
fs.readFile("F:\\WebStorm-workspace\\node\\02.文件系统\\an.jpg" , function (err , data) {
if(!err){
//console.log(data);
//将data写入到文件中
fs.writeFile("C:\\Users\\郭帅\\Desktop\\helloNpm\\hello.jpg",data,function(err){
if(!err){
console.log("文件写入成功");
}
} );
}
});
4.流式文件读取
流式文件读取也适用于一些比较大的文件,可以分多次将文件读取到内存中
var fs = require("fs");
//创建一个可读流
var rs = fs.createReadStream("F:\\WebStorm-workspace\\node\\02.文件系统\\a.mp3");
//创建一个可写流
var ws = fs.createWriteStream("b.mp3");
//监听流的开启和关闭
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("可写流关闭了~~");
});
//如果要读取一个可读流中的数据,必须要为可读流绑定一个data事件,data事件绑定完毕,它会自动开始读取数据
rs.on("data", function (data) {
// console.log(data.length);
// 将读取到的数据写入到可写流中
ws.write(data);
});
pipe()可以将可读流中的内容,直接输出到可写流中
var fs = require("fs");
//创建一个可读流
var rs = fs.createReadStream("F:\\WebStorm-workspace\\node\\02.文件系统\\a.mp3");
//创建一个可写流
var ws = fs.createWriteStream("c.mp3");
//pipe()可以将可读流中的内容,直接输出到可写流中
rs.pipe(ws);
fs模块的其他方法
-
fs.existsSync(path) 检查一个文件是否存在
var isExists=fs.existsSync("123.mp3"); //console.log(isExists); false
-
fs.stat(path,callback)
fs.statSync(path)
获取文件的状态
它会给我们返回一个对象,这个对象中保存了当前对象状态的相关信息fs.stat("F:\\WebStorm-workspace\\node\\02.文件系统\\a.mp3",function (err,stat) { console.log(stat.size); });
-
fs.readdir(path[,options],callback)
fs.readdirSync(path[,options]) 读取一个目录的目录结构
files是一个字符串数组,每一个元素就是一个文件夹或文件的名字fs.readdir(".",function (err,files) { if(!err){ console.log(files); } });
-
fs.truncate(path,len,callback)
fs.truncateSync(path,len)截断文件,将文件修改为指定的大小
fs.truncateSync("F:\\WebStorm-workspace\\node\\02.文件系统\\text2.txt",10);
-
fs.mkdir(path[,mode],callback)
fs.mkdirSync(path[,mode])
创建一个目录
fs.rmdir(path[,mode],callback)
fs.rmdirSync(path[,mode])
删除一个目录fs.mkdirSync("hello"); fs.rmdirSync("hello");
-
fs.rename(oldPath,newPath,callback)
fs.renameSyna(oldPath,newPath) 对文件进行重命名
参数:
oldPath 旧的路径
enwPath 新的路径
callback 回调函数fs.renameSync("F:\\WebStorm-workspace\\node\\c.mp3","d.mp3",function (err) { if(!err){ console.log("修改成功"); } });修改名字 fs.renameSync("F:\\WebStorm-workspace\\node\\d.mp3","C:\\Users\\郭帅\\Desktop\\helloNpm\\d.mp3",function (err) { if(!err){ console.log("修改成功"); } });修改位置
-
fs.watchFile(filename[,options],listener)
监视文件的修改
参数:
filename 要监视的文件的名字
options配置选项
listener 回调函数,当文件发生变化时,回调函数会执行
在回调函数中会有两个参数:
curr 当前文件的状态
prev 修改前文件的状态
-这两个对象都是stats对象fs.watchFile("F:\\WebStorm-workspace\\node\\02.文件系统\\hello.txt",{interval:1000},function (curr,prev) { console.log("修改前文件大小"+prev.size); console.log("修改后文件大小"+curr.size); });