Node.js基础模块
鹿酒 2017/2/21 Node.js

# Buffer(缓冲区)
# 理解与使用
因为JavaScript对Unicode友好,但难以处理二进制数据。
而TCP流与文件系统经常需要操作字节流,于是在Buffer类中存储原始数据。
操作Buffer就像操作JavaScript的数组类似。 一旦创建了Buffer实例化对象,就不能改变它的大小。
因为Buffer是全局对象,所以不需要使用 “ require('buffer') ”。
var buf = new Buffer(size);
1

| Buffer静态方法 | Buffer静态方法使用含义 |
|---|---|
| poolSize | 内存载体的容量 |
| isBuffer | 判断对象类型是否是Buffer |
| compare | 用来判断两个Buffer对象的相对位置,一般做字符串排序 |
| isEncoding | 支持某种编码,中文~UTF-8 |
| concat | 连接几个Buffer对象作为一个新的Buffer对象 |
| byteLength | 指定字符串编码所占据的字符数 |
| Buffer实例方法 | Buffer实例方法使用含义 |
|---|---|
| buffer[index] | 根据下标确定第index个位置的内容 |
| buffer.length | 确定Buffer的长度 |
| buffer.write(string , offser , length , encoding) | 当有了string参数就可以对Buffer写入内容(长度改变的内容不会影响Buffer的长度。长了,会自动截取多余的部分;短了,仅更改部分的信息。)。offset作为起始下标位置,默认0。length表示将要写入的字符串大小。encoding是编码格式,默认'utf8'。 |
| buffer.toString(encoding , start=0 , end=buffer.length) | 输出Buffer的内容 |
| buffer.copy(target , tStart , sStart , sEnd=buffer.length) | target表示目标buffer(target)Start表示从目标Buffer的第几个字节开始写,默认是0。sStart表示原Buffer(buffer,默认是0。sEnd表示原Buffer的终止位置,默认是buffer.length。 |
| buffer.slice(start , end) | 剪切出一个新的buffer,这个buffer将会和原来的buffer引用相同的内存地址,start(默认0)、end(默认buffer.length)表示截取的索引。 |
| buffer.compare(otherBuffer) | 对比两个buffer,相同(返回0),在buf在otherBuff之前返回(-1)。 |
| buffer.equals(otherBuffer) | 对比两个buffer是否相同(返回true) |
| buffer.fill(value , offset , end) | 用value填充整个buffer,offset(默认0)、end是(默认buffer.length)表示填充的索引 |
# Demo01
对照片进行base64编码方式的转换。

var fs = require('fs');
fs.readFile('big.jpg',function(err,origin_buffer) {
console.log(Buffer.isBuffer(origin_buffer));
fs.writeFile('logo_buffer.png',origin_buffer,function (err) {
if (err) {
console.log(err);
}
})
/*var base64Image = new Buffer(origin_buffer).toString('base64');*/
var base64Image = origin_buffer.toString('base64');
console.log(base64Image);
var decodedImage = new Buffer(base64Image,'base64');
console.log(Buffer.compare(origin_buffer,decodedImage));
fs.writeFile('logo_decoded.png',decodedImage,function(err) {
if (err) {
console.log(err);
}
})
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 逻辑分析
Buffer,作为缓冲池,直接操作内存,上面的代码先读了一张照片,然后把照片存储在缓冲池中,然后把缓冲池中的照片编码写入到本地。
中间写了两张照片到本地,第一章是直接写入,第二章是先把照片转换为base64编码方式,然后存入缓冲池,最后在写照片的时候把编码方式为base64的这段代码转换为照片。
中间有执行报错的回调函数(err)。
# Stream(流)
# 理解
Stream就像是管道一样,是一个抽象接口,实现了操作数据时的加载方式。
对http服务器发送请求的request对象就是一个stream,还有标准输出时等。
# Demo02
查看流的运行状态与常用事件。

var fs = require('fs');
var readStream = fs.createReadStream('stream_copy_logo.js');
var n = 0;
readStream
.on('data',function(chunk) {
n++;
console.log('data emits');
console.log(Buffer.isBuffer(chunk));
/*console.log(chunk.toString('utf8'));*/
readStream.pause();
console.log('data pause');
setTimeout(function() {
console.log('data pause end');
readStream.resume();
},2000);
})
.on('readable',function() {
console.log('data readable');
})
.on('end',function() {
console.log(n);
console.log('data ends');
})
.on('close',function() {
console.log('data close');
})
.on('error',function() {
console.log('data read error' + e);
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 逻辑
这里主要创建一个读取的流,然后根据绑定不同事件来观察Stream加载文件时的状态。
常用的事件有:
data - 当有数据可读时触发。
end - 没有更多的数据可读时触发。
error - 在接收和写入过程中发生错误时触发。
finish - 所有数据已被写入到底层系统时触发。