在Node中,应用需要处理网络协议、操作数据库、处理图片、接收上传文件等,在网络流和文件的操作中,还要处理大量二进制数据,JavaScript语言没有读取或操作二进制数据流的机制。
Buffer 类的实例类似于从 0 到 255 之间的整数数组(其他整数会通过 & 255 操作强制转换到此范围),但对应于 V8 堆外部的固定大小的原始内存分配。 Buffer 的大小在创建时确定,且无法更改。
Buffer 类在全局作用域中,因此无需使用 require('buffer').Buffer。
Buffer的创建:
//Buffer.from()、Buffer.alloc() 与 Buffer.allocUnsafe()
let buffer = Buffer.from('23');
console.log(buffer);
const buf = Buffer.from([0x62, 0x75, 0x66, 0x66, 0x65, 0x72]); //使用一个8位字节的数组分配一个新的 Buffer。
console.log(buf.toString());
const arr = new Uint16Array(2);
arr[0] = 5000;
arr[1] = 4000;
const buf = Buffer.from(arr.buffer); // shares the memory with arr;
console.log(buf); //<Buffer 88 13 a0 0f>
arr[1] = 7000;
console.log(buf); //<Buffer 88 13 58 1b>
let buffer = Buffer.alloc(10); // 创建一个长度为 10、且用零填充的 Buffer。
//<Buffer 00 00 00 00 00 00 00 00 00 00>
Buffer.concat(list[, totalLength]);
返回一个合并了 list 中所有 Buffer 实例的新 Buffer。
如果 list 中没有元素、或 totalLength 为 0,则返回一个长度为 0 的 Buffer。
const buf1 = Buffer.alloc(10, 0);
const buf2 = Buffer.alloc(14, 0);
const buf3 = Buffer.alloc(18, 0);
const totalLength = buf1.length+buf2.length+buf3.length;
console.log(totalLength);
const bufa = Buffer.concat([buf1, buf2, buf3], totalLength);
console.log(bufa);
console.log(bufa.length);
//42
//<Buffer 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00>
//42
buf.write(string[, offset[, length]][, encoding]);
将sring写入buf实例,同时返回写入的字节数。
参数如下:
string:写入的字符串。
offset:从buf的第几位开始写入,默认是0。
length:写入多少个字节,默认是 buf.length - offset。
encoding:字符串的编码,默认是utf8。
var buff = Buffer.alloc(4);
buff.write('a'); // 返回 1
console.log(buff); // 打印 <Buffer 61 00 00 00>
buff.write('ab'); // 返回 2
console.log(buff); // 打印 <Buffer 61 62 00 00>
buf.toString([encoding[, start[, end]]]); 转成字符串
var buff = Buffer.from('hello');
console.log( buff.toString() ); // hello
console.log( buff.toString('utf8', 0, 2) ); // he
buf.toJSON() 转成JSON字符串
var buff = Buffer.from('hello');
console.log( buff.toJSON() ); // { type: 'Buffer', data: [ 104, 101, 108, 108, 111 ] }
stream是一个抽象接口,该抽象接口是可读、可写或是既可读又可写的,通过这些接口,我们可以和磁盘文件、套接字、HTTP请求来交互,实现数据从一个地方流动到另一个地方的功能。
所有的Stream对象都是EventEmitter的实例,常用的事件有四个:
data-当有数据可读时触发
end-当没有数据可读时触发
error-在接受和写入过程中发生错误时触发
finish-当所有的数据已经写入到底层系统时触
流读取:
const fs = require('fs');
const readStream = fs.createReadStream('./test.txt');
let data = '';
readStream.setEncoding('utf8');
readStream.on('data', function(chunk){
data+=chunk;
});
readStream.on('end', function(){
console.log(data);
console.log('流读取结束');
});
readStream.on('error', function(err){
console.log(err);
});
console.log('执行结束!');
写入流:
const fs = require('fs');
const writeStream = fs.createWriteStream('./test.txt',{'flags':'a'});
let data = '测试内容!!!';
writeStream.write(data, 'utf8');
writeStream.end();
writeStream.on('finish', function(){
console.log('写入结束!');
});
writeStream.on('error', function(err){
console.log(err);
});
console.log('执行结束!!!!!');
管道流:管道提供一种输出流到输入流的机制,通常用于从一个流中获取数据到另一个流中。
const fs = require('fs');
const readStream = fs.createReadStream('./a.txt');
readStream.setEncoding('utf8');
const writeStream = fs.createWriteStream('./b.txt');
readStream.pipe(writeStream);
console.log('执行结束!!');
网友评论