Node.js中的数据处理IO-json && buffer

标签:node javaScript

处理JSON

JSONJavaScript中其实不神秘,两个方法就足以解决(当然前提是你了解JS对象):

  1. JSON ==> JavaScript对象
var a = '{"name":"xuan"}';  
JSON.parse(a);  
  1. JavaScript ==> JSON
var a = {"name":"xuan"};  
JSON.stringify(1);  

Buffer模块的使用

现实中的大多数的数据存储方式都是二进制的,Node.js中的Buffer模块就是为了增加JavaScript对二进制文件的友好程度(大家都知道JavaScriptutf8非常友好,但是对于二进制就有点无所适从了)。主要应对的场景如下

传输压缩文件;
生成动态图像;
发送序列化的二进制数据;
...

注: Buffer被存储在正常V8堆之外的原始内存分配中。因此,Buffer是不能调整大小的。

  • Buffer的创建
new Buffer(sizeInByte)  
new Buffer(octetArray) //二进制数组  
new Buffer(string,[encoding])  
//eg:
var buf256 = new Buffer(256);  
var bufOctets = new Buffer([0x6f,0x63]);  
var bufUTF8 = new Buffer("some utf8 string",'utf8');  
  • Buffer的写入

注: Buffer对象创建后,不能改变其大小。不过可以通过一个新对象,将旧对象中内容进行复制即可实现Buffer对象长度的扩展。

主要方法:

//使用 encoding 的编码从缓冲区内的 offset 开始,写入 string 中 length 数量的字节
buffer.write(string,[offset],[length],[encoding]);

buffer[offset] = value;

//将 value 写到缓冲区中从 offset 出开始,并在 end 处的每一个字节
buffer.fill(value,[offset],[end]);

//写入相应的数据类型,从 offset 开始写入 value , noAssert 用于控制是否验证 value 和 offset 的验证,默认验证。
buffer.writeInt8(string,offset,[noAssert])

//eg
buf256 = new Buffer(256);  
buf256.fill(0);  
buf256.write("add some text");  
console.log(buf256.toString());  
//console : add some text
buf256.write("more text", 9, 9);  
console.log(buf256.toString());  
//console : add some more text
buf256[18] = 43;  
console.log(buf256.toString());  
//console : add some more text+
  • Buffer的读取

读取操作仅仅是将Buffer中的内容读取出来,返回一个新对象,并不会改变Buffer的内容。

//返回从缓冲区start到end的encoding编码的字符串
buffer.toString([encoding],[start],[end]);

//使用StringDecoder对象,返回Buffer的解码字符串版本
stringDecoder.write(buffer);

//返回buffer在offset的字节8进制值
buffer[offset];

//读出相应数据类型的数据,从offset开始读取,noAssert用于判断是否验证
readInt8(offset,[noAssert])  
readInt16LE(offset,[noAssert])  
...

//eg
bufUTF8 = new Buffer("Some UTF8 Text \u00b6 \u30c6 \u20ac", 'utf8');  
console.log(bufUTF8.toString());  
console.log(bufUTF8.toString('utf8', 5, 9));  
var StringDecoder = require('string_decoder').StringDecoder;  
var decoder = new StringDecoder('utf8');  
console.log(decoder.write(bufUTF8));  
console.log(bufUTF8[18].toString(16));  
console.log(bufUTF8.readUInt32BE(18).toString(16));  
  • 确定Buffer的长度

注: 确定字符串在缓冲区中占用的字节长度,不能使用 .length ,而应使用 .byteLength。这就好比一个巨胖的胖子占了两座,而只有一个人一样。

Buffer.byteLength(string,[encoding]);

//eg
"UTF8 text \u00b6".length;
// 为11
Buffer.byteLength("UTF8 text \u00b6",'utf8');  
// 为12
Buffer("UTF8 text \u00b6").length;  
// 为12
//相同字符串返回结果不同的原因为:它包含双字节字符。所以 byteLength 为12,而Buffer返回的是字节长度。
  • 复制Buffer

注: 返回对象为一个新的 Buffer 对象,同时需要注意的是:若要从一个Buffer复制数据到另一个Buffer,应确保两个缓冲区使用相同的编码。

//将soureBuffer从soureStart开始到soureEnd的数据内容复制到targetBuffer从targetStart开始数据空间
soureBuffer.copy(targetBuffer,[targetStart],[soureStart],[soureEnd]);

//也可以通过赋值操作对buffe进行赋值
targetBuffer[index] = soureBuffer[index];

//eg:
var alphabet = new Buffer('abcdefghijklmnopqrstuvwxyz');  
console.log(alphabet.toString());  
//console : abcdefghijklmnopqrstuvwxyz
// copy full buffer
var blank = new Buffer(26);  
blank.fill();  
console.log("Blank: " + blank.toString());  
//console : Blank:
alphabet.copy(blank);  
console.log("Blank: " + blank.toString());  
//console : Blank: abcdefghijklmnopqrstuvwxyz
// copy part of buffer
var dashes = new Buffer(26);  
dashes.fill('-');  
console.log("Dashes: " + dashes.toString());  
//console : Dashes: -------------------------
alphabet.copy(dashes, 10, 10, 15);  
console.log("Dashes: " + dashes.toString());  
//console : Dashes: --------klmno------------
// copy to and from direct indexes of buffers
var dots = new Buffer('-------------------------');  
dots.fill('.');  
//console : Dashes: .........................
console.log("dots: " + dots.toString());  
for (var i=0; i < dots.length; i++){  
  if (i % 2) { dots[i] = alphabet[i]; }
}
console.log("dots: " + dots.toString());  
  • 对Buffer进行切片操作

注: 切片操作其实就是获取一段Buffer的索引,所以当对切片进行操作时,对应Buffer的原始位置的数据也会做出相应的修改。

//对buffer的start end区间进行切片,返回索引
buffer.slice([start],[end]);

//eg
var numbers = new Buffer("123456789");  
console.log(numbers.toString());  
//console : 123456789
var slice = numbers.slice(3, 6);  
console.log(slice.toString());  
//console : 456
slice[0] = '#'.charCodeAt(0);  
slice[slice.length-1] = '#'.charCodeAt(0);  
console.log(slice.toString());  
//console : #5#
console.log(numbers.toString());  
//console : 123#5#789
  • 拼接Buffer

可以把两个或是多个Buffer对象拼接在一起,形成一个 Buffer

//totalLength用于定义总长度
buffer.concat(list,[totalLength]);

//eg
var af = new Buffer("African Swallow?");  
var eu = new Buffer("European Swallow?");  
var question = new Buffer("Air Speed Velocity of an ");  
console.log(Buffer.concat([question, af]).toString());  
//console : Air Speed Velocity of an African Swallow?
console.log(Buffer.concat([question, eu]).toString());  
//console : Air Speed Velocity of an European Swallow?

小结:总的来说Buffer对象封装的一系列方法都是简单明了的,在详细的了解过之后其实也不难。当然这需要对JavaScript这语言,对函数式编程有一定程度的了解。