nodeJs的buffer类

nodejs中的buffer类
在javascript中对于二进制的操作没有很良好的支持,但是在处理tcp或者文件流的时候(当然在js中这个不重要),必须处理二进制文件,所以在nodejs定义了一个buffer类,专门用于处理二进制流,主要创建一个二进制缓存区
查看补充1:
创建buffer对象——new Buffer(size)
创建一个buffer对象并且初始化大小(通过构造函数)


采用了16进制输来显示了二进制数据


Buffer.fill(value,[offset],[end])----通过fill方法来初始化缓存区中的所有类容
参数1——必须,参数值为必须写入的数值
参数2----不必须,默认值为0,指定从参数1第几个字节开始写入
参数3——不必须,默认是为参数值的大小,默认最大
案例
v=new BUffer(128);
buf.fill(1,10)
方式2,可以使用第二种构造参数(数组的方式来构造)new Buffer(array)
v=new Buffer([1,2,3])
方式3:直接采用字符串new Buffer(str,[encoding])
这种方式第一个参数为必须指定的,用于初始化的字符串,第二个参数为指定的编码格式默认值为utf-8
可以使用的编码格式:
ascii——ascii字符串 base64编码 经过base64编码后的字符串
utf8 二进制数据
utf16le 十六进制表示的二进制编码
ucs2


在nodejs中一个字符串的长度与该字符串所创建的缓存区的长度不相等,字符串长度以文字为单位而缓存区长度以字节为单位
测试




我们还可以取出这些存放在字符串和buffer中的某个特定值(没有指定的话从0开始)
var str='hello world'
console.log(str[2]);
var v=new Buffer(str);
console.log(v[2]);
注意字符串对象已被创建就不能被修改但是buffer对象是可以被修改的,因为它是最底层的二进制
修改案例


buffer对象也有toString()方法
buf.toString([encoding],[start],[end])
参数1:指定buffer对象中保存文字的编码格式
参数2  参数3略
var str="hello world";
var buf=new Buffer(str);
console.log(buf);
//console.log(buf.toString());
console.log(buf.toString('utf8',9,12))


BUffer对象write方法
我们之前学习了把二进制转换为字符串的方法,那现在如果我们要把字符串当作二进制数据来使用,我们只需要将该字符串作为Buffer类的构造函数的参数传入即可,但是有时候我们也需要将已经创建好的Buffer插入新的数据进去,这时候我们需要使用write()方法
buf.write(string,[offset],[length],[encoding])  length---代表写多少个进去,别的被抛弃
注意字节数据的书写位置从1+offset一直到offset+length结束(3,6  4-9)
联系:汉字一般占用三个   字符占一个


当我们需要将buffer中的数据拷贝到另外一个Buffer中去的时候,我们可以使用它的copy方法
buf.copy(targetBuffer,[targerStart],[sourceStart],[SourceEnd])
案例:


常用方法:
Buffer.isBuffer(?);-判断某个对象是不是Buffer
Buffer.byteLength()——计算一个字符串指定的字节数
Buffer.concat([1,2,3,4])——连接几个Buffer成为一个新的Buffer







补充1:
字节(Byte):通常将可表示常用英文字符8位二进制称为一字节 。  01000101
一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间.
符号:英文标点2占一个字节,中文标点占两个字节.


1字节(Byte) = 8位(bit)


比特(Bit),亦称二进制位


补充2:
我们在保存字符串的时候,该用string还是要用Buffer,就算大字符串拼接string的速度也不会比buffe慢。
那什么时候我们又需要用buffer呢?没办法的时候,当我们保存非utf-8字符串,2进制等等其他格式的时候,我们就必须得使用了














nodejs文件操作
nodejs中所有与文件相关的操作都在内置的fs模块里边  
nodejs的一大特点是异步操作(之前已经讲过),但是我们有时候在一些特殊操作的时候,例如服务器启动配置等,我们就需要同步操作,对于同步操作node也有自己的一套操作方法


案例1:文件读取
同步方式读取
var fs=require('fs');
var data=fs.readFileSync('./error.txt','utf-8');
console.log(data);






异步方式读取:
var data=fs.readFile('c://wode.txt','utf8',function(error,data){
console.log(data);
});
将结果作为回调函数的参数进行返回,在方法调用之后可以立即执行后续代码思考一下,如果有多个文件同时读取,能不能保证顺序?


如果需要确保我们读取完一个文件再去读取下一个,可以采取这样的方式
var data=fs.readFile('c://wode.txt','utf8',function(error,data){
console.log(data);
var data=fs.readFile('c://wode.txt','utf8',function(error,data2){
console.log(data2)
}
});


readFile(filename,[option],callback)


读取文件
1:找到并且打开文件--open()
2:从文件读取类容(开始位置,结束位置)
3:读取一部分后存入你的缓存区,把缓存区的类容----调用者----》再次从源文件读取数据
4:关闭




option--常见参数
r-默认:如果所读取的文件不存在则抛出异常
w-写入文件,如果不存在则抛出异常
a-追加文件,如果文件不存在写抛出异常
方式2指定读取的编码格式
同上例子,如果不指定编码格式,则按照存放文件中原始二进制类容的缓冲对象,通过toString()打印出来
callback参数,
第一个:发生错误触发
第二个:读取到的文件


同步方式var date=fs.readFileSync(filename,[options])
那同步的方式如果产生错误怎么解决?
try{}catch()


写入文件
writeFile(filename,data,[option],callback)
option
-flag指定对文件采取哪种操作默认为w和read一致
mode属性指定权限默认0666可读写   1执行权限 2写权限 4读权限
encoding:编码格式
var fs=require('fs');
fs.writeFile('c:/hello.txt','hehe',function(error){
if(error){
console.log('失败');
}else{
console.log('ok')
}
})


var options={flag:'a'}——追加
 案例:fs.writeFile('c:/wode.txt','hahah \t',options,function(err)
案例图片的复制
fs.readFile('c:/bg.gif',function(error,data){
fs.writeFile('./bg.gif',data,function(error){
if(error) console.log('error')
else console.log('ok')
})
})


同步方式写入 writeFileSync(filename,data,[options])




----11/13


创建目录
fs.mkdir('path',[mode],callback)
fs.mkdir('c:/test',function(err){
console.log('ok')
})


读取目录
fs,readdir(path,callback)


文件流
之前学的write方法,我们是怎么使用的?
将需要写入的数据放入到一个内存缓冲区中
待缓冲区写满后将缓冲区的内容写入到文件中
重复之前的动作


在很多时候我们并不关心整个文件的内容,我们只需要从文件中读取到某些数据,这时候我们可以采用文件流来处理


流是一组有序的,有起点和重点的传输手段,


使用ReadStream读取对象
var fs=require('fs');
var file =fs.createReadStream('c:/test.txt');
file.on('open',function(fd){
console.log(fd)
})
file.on('data',function(data){
console.log(data)
})
file.on('end',function(){
console.log('读取完毕')
})
file.on('error',function(){
console.log('读取失败')
})
var file =fs.createReadStream('c:/test.txt',{start:2,end:3});--指定开始和结束




写入文件流
var out=fs.createWriteStream(path,[options])
out.write(待写入数据)


var fs=require('fs');


var file =fs.createReadStream('c:/test.txt',{start:2,end:3});
var out=fs.createWriteStream('c:/test2.txt')
file.on('data',function(data){
out.write(data);
})
file.on('end',function(){
out.end(function(){
console.log('over1');
})
console.log('over2')
})























  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值