1. node Buffer
處理tcp散址,文件等流的時(shí)候,必須要用到二進(jìn)制數(shù)據(jù)宣赔,node的Buffer就是一個(gè)專門存放二進(jìn)制數(shù)據(jù)的緩沖區(qū)预麸。
當(dāng)需要在node中處理I/O操作中移動(dòng)的數(shù)據(jù)時(shí),就需要用到Buffer
1.1 創(chuàng)建Buffer
//指定長度
let buf1=new Buffer(10)
//通過數(shù)組創(chuàng)建buffer
let buf2=new Buffer([1,2,3,4])
//字符串buffer
let buf3=new Buffer('this is a buffer','utf8')
1.2 寫入緩沖區(qū)
/*可選參數(shù):offset開始寫入的索引值儒将,默認(rèn)0;length默認(rèn)為buf的length吏祸;encoding編碼,默認(rèn)utf8
buf.write(string,offset,length,encoding)
返回實(shí)際寫入的大小钩蚊,大小不足則只寫入部分字符串
let buf1=new Buffer(10)
console.log(buf1.write('this is a buffffffffffffff')) //10
1.3 從緩沖區(qū)讀取
buf.toString(encoding,start,end)
encoding編碼贡翘,默認(rèn)utf8;start起始索引砰逻,默認(rèn)0鸣驱;end結(jié)束索引,默認(rèn)結(jié)尾
let buf1=new Buffer(10)
console.log(buf1.write('this is a buffffffffffffff'))
console.log(buf1.toString()) //this is a
console.log(buf1.toString('utf8',1,4)) //his
1.4 Buffer一些屬性方法
緩沖區(qū)長度
buf.length
轉(zhuǎn)換為json
let buf1=new Buffer(10)
console.log(buf1.write('this is a buffffffffffffff'))
console.log(buf1.toJSON())
10
{ type: 'Buffer',
data: [ 116, 104, 105, 115, 32, 105, 115, 32, 97, 32 ] }
合并緩沖區(qū)
Buffer.concat([buf1,buf2,....],length)
length為可選參數(shù)蝠咆,指定合并后的總長度
緩沖區(qū)比較
buf1.compare(buf2)
//buf1在buf2之前踊东,返回-1,相同位置0刚操,之后1
緩沖區(qū)復(fù)制
buf1.copy(buf2)
//buf1內(nèi)容復(fù)制給buf2
緩沖區(qū)裁剪
buf1.slice(1,5)
2. Stream
流是一種抽象的數(shù)據(jù)結(jié)構(gòu)递胧,如標(biāo)準(zhǔn)輸入流,文件流等赡茸。
常用的事件有:data缎脾,有數(shù)據(jù)可讀時(shí)觸發(fā);end占卧,沒有數(shù)據(jù)可讀時(shí)觸發(fā)遗菠;error,發(fā)生錯(cuò)誤時(shí)觸發(fā)华蜒;finish辙纬,所有數(shù)據(jù)都被寫入底層時(shí)觸發(fā)。
2.1讀取文件流
let fs=require('fs')
let stream=fs.createReadStream('hello.txt','utf-8')
let data=''
stream.on('data',function(chunk){
data+=chunk
})
stream.on('error',function(err){
console.log(err)
})
stream.on('end',function(){
console.log(data)
console.log('read end')
})
2.2寫入文件流
let fs=require('fs')
let stream=fs.createWriteStream('output.txt')
let data='helloworld'
stream.write(data,'utf-8')
stream.end()
stream.on('finish',function(){
console.log('write finish')
})
2.3pipe
管道流叭喜,從輸出流到輸入流的機(jī)制贺拣,常用于從一個(gè)流中讀取數(shù)據(jù),并寫入另一個(gè)流中。node提供pipe()方法譬涡,將兩個(gè)流像一個(gè)水管一樣地串了起來闪幽,這樣可以從讀取文件流直接寫入對(duì)應(yīng)的程序了,這樣可以實(shí)現(xiàn)復(fù)制大文件的功能涡匀。
let fs=require('fs')
let stream1=fs.createReadStream('hello.txt','utf8')
let stream2=fs.createWriteStream('output.txt')
stream1.pipe(stream2)