缓冲(buffer)模块
js
早先就是为浏览器而设想的,所以能很好的处置惩罚unicode
编码的字符串,但不能很好的处置惩罚二进制数据。这是Node.js
的一个题目,因为Node.js
旨在收集上发送和吸收常常是以二进制花样传输的数据。比方:
- 经由过程TCP衔接发送和吸收数据;
- 从图象或许压缩文件读取二进制数据;
- 从文件体系读写数据;
- 处置惩罚来自收集的二进制数据流
而Buffer
模块为Node.js
带来了一种存储原始数据的要领,因而可以再js
的高低文中运用二进制数据。每当需要在Node.js
中处置惩罚I/O
操纵中挪动的数据时,就有可以运用Buffer模块。
类:Buffer
Buffer
类是一个全局变量范例,用来直接处置惩罚2进制数据的。 它可以运用多种体式格局构建。
原始数据保存在 Buffer
类的实例中。一个 Buffer
实例相似于一个整数数组
1.new Buffer(size):分派一个新的 buffer 大小是 size 的8位字节.
2.new Buffer(array):分派一个新的 buffer 运用一个8位字节 array 数组.
3.new Buffer(str, [encoding]):encoding String范例 - 运用什么编码体式格局,参数可选.
4.类要领: Buffer.isEncoding(encoding):如果给定的编码 encoding 是有用的,返回 true,不然返回 false。
5.类要领: Buffer.isBuffer(obj):测试这个 obj 是不是是一个 Buffer. 返回Boolean
6.类要领: Buffer.concat(list, [totalLength]):list {Array}数组范例,Buffer数组,用于被衔接。totalLength {Number}范例 上述Buffer数组的一切Buffer的总大小。
除了可以读取文件获得Buffer
的实破例,还可以直接组织,比方:
var bin = new Buffer([ 0x48, 0x65, 0x6c, 0x6c, 0x6c ]);
Buffer
与字符串相似,除了可以用.length
属性获得字节长度外,还可以用[index]
体式格局读取指定位置的字节,比方:
bin[0]; // => 0x48;
Buffer
与字符串可以互相转化,比方可以运用指定编码将二进制数据转化为字符串:
var str = bin.toString('utf-8'); // => "hello"
.slice
要领不是返回一个新的Buffer
,而更像是返回了指向原Buffer
中心的某个位置的指针,以下所示。
1.[ 0x48, 0x65, 0x6c, 0x6c, 0x6c ]
2. ^ ^
3. | |
4. bin bin.slice(2)
写入缓冲区
var buffer = new Buffer(8);//建立一个分派了8个字节内存的缓冲区
console.log(buffer.write('a','utf8'));//输出1
这会将字符"a"
写入缓冲区,node
返回经由编码今后写入缓冲区的字节数目,这里的字母a
的utf-8
编码占用1个字节。
复制缓冲区
Node.js
供应了一个将Buffer
对象团体内容复制到另一个Buffer
对象中的要领。我们只能在已存在的Buffer
对象之间复制,所以必需建立它们。
buffer.copy(bufferToCopyTo)
个中,bufferToCopyTo
是要复制的目的Buffer对象。以下示例:
var buffer1 = new Buffer(8);
buffer1.write('nice to meet u','utf8');
var buffer2 = new Buffer(8);
buffer1.copy(buffer2);
console.log(buffer2.toString());//nice to meet u
流模块
在UNIX
范例的操纵体系中,流是个规范的观点。有以下三个重要的流:
1.规范输入
2.规范输出
3.规范毛病
可读流
如果说,缓冲区是Node.js
处置惩罚原始数据的体式格局的话,那末流畅常是Node.js
挪动数据的体式格局。Node.js
中的流是可读的或许可写的。Node.js
中很多模块都运用了流,包含HTTP
和文件体系。
假定我们建立一个classmates.txt
的文件,并从中读入姓名清单,以便运用这些数据。因为数据是流,这就意味着完成文件读取之前,从收到最初几个字节最先,便可以对数据行动,这是Node.js
中的一个罕见形式:
var fs = require('fs');
var stream = fs.ReadStream('classmates.txt');
stream.setEncoding('utf8');
stream.on('data', function (chunk) {
console.log('read some data')
});
stream.on('close', function () {
console.log('all the data is read')
});
在以上示例中,在收到新数据时触发事宜数据。当文件读取完成后触发封闭事宜。
可写流
明显,我们也可以建立可写流以便写数据。这意味着,只需一段简朴的剧本,便可以运用流读入文件然后写入另一个文件:
var fs = require('fs');
var readableStream = fs.ReadStream('classmates.txt');
var writableStream = fs.writeStream('names.txt');
readableStream.setEncoding('utf8');
readableStream.on('data', function (chunk) {
writableStream.write(chunk);
});
readableStream.on('close', function () {
writableStream.end();
});
如今,当吸收到数据事宜时,数据会被写入可写流中。
readable.setEncoding(encoding):返回: this
readable.resume():同上。该要领让可读流继承触发 data 事宜。
readable.pause():同上。该要领会使一个处于活动形式的流住手触发 data 事宜,切换到非活动形式,并让后续可用数据留在内部缓冲区中。
类: stream.Writable
Writable
(可写)流接口是对您正在写入数据至一个目的的笼统。
1.writable.write(chunk, [encoding], [callback]):
chunk {String | Buffer} 要写入的数据
encoding {String} 编码,如果 chunk 是一个字符串
callback {Function} 数据块写入后的回调
返回: {Boolean} 如果数据已被悉数处置惩罚则 true。
该要领向底层体系写入数据,并在数据被处置惩罚完毕后挪用所给的回调。
2.writable.cork():强行滞留一切写入。
滞留的数据会在 .uncork()
或 .end()
挪用时被写入。
3.writable.end([chunk], [encoding], [callback])
chunk {String | Buffer} 可选,要写入的数据
encoding {String} 编码,如果 chunk 是一个字符串
callback {Function} 可选,流完毕后的回调
在挪用 end()
后挪用 write()
会发生毛病。
// 写入 'hello, ' 然后以 'world!' 完毕
http.createServer(function (req, res) {
res.write('hello, ');
res.end('world!');
// 如今不允许继承写入了
});