1. node Buffer
处理tcp,文件等流的时候,必须要用到二进制数据,node的Buffer就是一个专门存放二进制数据的缓冲区。
当需要在node中处理I/O操作中移动的数据时,就需要用到Buffer
1.1 创建Buffer
//指定长度
let buf1=new Buffer(10)
//通过数组创建buffer
let buf2=new Buffer([1,2,3,4])
//字符串buffer
let buf3=new Buffer('this is a buffer','utf8')
1.2 写入缓冲区
/*可选参数:offset开始写入的索引值,默认0;length默认为buf的length;encoding编码,默认utf8
buf.write(string,offset,length,encoding)
返回实际写入的大小,大小不足则只写入部分字符串
let buf1=new Buffer(10)
console.log(buf1.write('this is a buffffffffffffff')) //10
1.3 从缓冲区读取
buf.toString(encoding,start,end)
encoding编码,默认utf8;start起始索引,默认0;end结束索引,默认结尾
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一些属性方法
缓冲区长度
buf.length
转换为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 ] }
合并缓冲区
Buffer.concat([buf1,buf2,....],length)
length为可选参数,指定合并后的总长度
缓冲区比较
buf1.compare(buf2)
//buf1在buf2之前,返回-1,相同位置0,之后1
缓冲区复制
buf1.copy(buf2)
//buf1内容复制给buf2
缓冲区裁剪
buf1.slice(1,5)
2. Stream
流是一种抽象的数据结构,如标准输入流,文件流等。
常用的事件有:data,有数据可读时触发;end,没有数据可读时触发;error,发生错误时触发;finish,所有数据都被写入底层时触发。
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
管道流,从输出流到输入流的机制,常用于从一个流中读取数据,并写入另一个流中。node提供pipe()方法,将两个流像一个水管一样地串了起来,这样可以从读取文件流直接写入对应的程序了,这样可以实现复制大文件的功能。
let fs=require('fs')
let stream1=fs.createReadStream('hello.txt','utf8')
let stream2=fs.createWriteStream('output.txt')
stream1.pipe(stream2)