Node.js学习之路day2

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')
})
image.png

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')
})
image.png

2.3pipe

管道流,从输出流到输入流的机制,常用于从一个流中读取数据,并写入另一个流中。node提供pipe()方法,将两个流像一个水管一样地串了起来,这样可以从读取文件流直接写入对应的程序了,这样可以实现复制大文件的功能。

let fs=require('fs')
let stream1=fs.createReadStream('hello.txt','utf8')
let stream2=fs.createWriteStream('output.txt')
stream1.pipe(stream2)

推荐阅读更多精彩内容