Buffer缓冲区
简介
buffer的结构和数组很像,操作也相似,buffer可以存储数组不能存储的二进制文件。使用buffer不许要引入,buffer存储的是二进制显示的是十六进制。 buffer在连续内存中,buffer大小一旦缺点不能修改,buffer底层内存直接操作。
- buffer中每一个元素大小范围是从00000000-11111111(00-FF);
- 计算机中存储耳朵0或1,成为1bit,8bit-1byte字节;
- buffer中一个元素占用内存一个字节,也就是八位。
var str = "my task";
var buf = Buffer.from(str);
console.log(str);
console.log(buf)
常用API
http://nodejs.cn/api/buffer.html
创建方法
var str = "my task";
//1、字符串转换
var buf1 = Buffer.from(str);
//2、通过构造方法创建长度为10的buffer,不推荐使用
var buf2 = new Buffer(10);
//3、通过类方法创建长度为10的buffer,最常用
var buf2 = Buffer.alloc(10);
//4、allocUnsafe方法也可以创建buffer,可能存在敏感数据,分配空间不清空数据,性能好
Buffer.allocUnsafe(10);
常用方法
var buf = Buffer.alloc(10);
//和数组类似用[]的形式给buffer赋值,默认十进制,0x表示十六进制
buf[0] = 89;
buf[1] = 0xaa;
//buffer中存储的是二进制,直接打印buffer显示的是十六进制,打印某一个元素显示的是十进制
console.log(buf[0]);//89
console.log(buf[1]);//170
console.log(buf);//<Buffer 59 aa 00 00 00 00 00 00 00 00>
//使用toString(16)转换成16进制输出
console.log(buf[1].toString(16));//aa
//对buffer使用toString()方法显示buffer中存储的字符
console.log(buf.toString());//Y�
//如果输入超过255,则会在转换成二进制以后仅保留后八位
buf[2] = 257;
console.log(buf[2]);//1
文件系统(fs)
常用API: http://nodejs.cn/api/fs.html
通过node操作系统文件,node中文件系统交互非常重要,服务器本身就是将本地文件发送给远程客户端,node通过fs模块和文件系统进行交互。该模块提供一些标准文件访问API来打开读取和写入文件与其交互。需要引入,核心模块不需要下载。
同步和异步
fs所有方法都有两种形式可供选择同步和异步,异步都有callback参数。同步文件系统会阻塞,异步不会阻塞,而是操作完成时通过回调函数将结果返回。
同步文件写入
//文件写入fs模块
var fs = require("fs");
//打开文件fs.openSync(path[,flags,model]) -path路径;flags(w可写的r可读的);
//model设置权限;返回文件描述作为结果
var fd = fs.openSync("hello1.txt","w");//返回文件描述
console.log(fd);//3
//写文件fs.writeSync(fd,string[,postion[,encoding]]) -fd文件描述;
//string写入文件内容;postion写入起始位置;encoding编码 默认utf—8
fs.writeSync(fd,"今天天气不错",20,"UTF-8");
//关闭文件
fs.closeSync(fd);
异步文件写入
var fs = require("fs");
//打开文件 fs.open(path,flags,model,callBack) -callBack回调函数
//回调参数两个对象,err错误对象,如果没有则为null,fd文件描述
fs.open("hello2.txt","w",function(err,fd){
if(!err){
//文件写入fs.writeSync(fd,string,postion,encoding,callBack)
fs.write(fd,"异步写入的内容",function(err){
if(!err){
console.log("写入成功");
}
//保存并关闭fs.close(fd,callBack)
fs.close(fd,function(err){
if(!err){
console.log("关闭成功");
}
});
});
}else{
console.log(err);
}
});
console.log("先执行的代码");
运行结果
异步写入并不是顺序运行,文件传输不会引起线程阻塞,所以性能相对比同步要高。异步代码有异常处理,如果出现异常不会影响主流程。
简单文件写入
fs.writeFile(flie,data[,option],callback)//异步
fs.writeFileSync(flie,data[,option])//同步
- file 要操作的路径
- data写入的数据
- callback回调函数
- 一般可以省略
var fs =require("fs");
fs.writeFile("h.txt","写入内容",function(err){
console.log("success");
})
//相对路径
fs.writeFileSyns("h.txt","写入内容")
//绝对路径
fs.writeFileSyns("C:\\Users\\Administrator\\Desktoph.txt","写入内容")
fs.writeFileSyns("C:/Users/Administrator/Desktoph.txt","写入内容")
文件的打开状态
文件打开状态“w"默认是原来覆盖已经有的内容。
fs.writeFileSyns("h.txt",{flag:"a"},"追加内容")
流式文件写入
同步、异步、简单文件写入都不适合大文件写入,容易出现内存问题。
// 创建可写流
fs.createReadStream(path[, options])
var fs = require("fs");
//创建流
var ws = fs.createWriteStream("hello.txt");
ws.once("open",function(){
console.log("流打开");
});
ws.once("close",function(){
console.log("流关闭");
});
ws.write("流写入内容1");
ws.write("流写入内容2");
ws.write("流写入内容3");
ws.write("流写入内容4");
//关闭流
ws.end();