技术干货

Node之IO

2017-09-07  本文已影响41人  人失格

Buffer

Buffer的构成

Buffer对象类似数组,它的元素位16进制的两位数,即0到255的数值。主要是用来存储二进制的数据

const buf = Buffer.from('Hello world')

初始化Buffer会随机的填充了0到255的随机值

var buffer = new Buffer(100);
buffer[20] = -100;

console.log(buffer[20]) // 如果存储的数字小于0或者大于255则直接加值256知道值位于0到255之间

Buffer的底层分配

Node从c++层面申请内存,在JS层面用来分配内存的策略,Buffer在C++申请内存主要是8K。

Buffer的转换

目前Buffer的对象是可以直接与字符串进行互相转换,目前支持的字符串编码类型有

Buffer的乱码现象

因为Buffer对象只要是用于二进制与字符串的转换,一旦设计编码 解码就会出现所谓的乱码现象,特别是出现在汉字编码问题。

var rs = fs.createReadStream('buffer.txt',{
  highWaterMark:11
});

var data = '';
rs.on('data',(thunk)=>{
  data +=thunk; // data.toString() += thunk.toString()
})

rs.on('end',()=>{
  console.log(data);
})

在Options上选择了highWaterMark,主要是影响操作系统读取文件的字节块,目前是按照11字节读取,因为汉字在UTF-8中编码只要是三个字节,所以在读取汉字的时候可能会出现两个字节导致无法编码,出现所谓的乱码现象。

乱码解决方案

Stream

Node.js中有四种基本的流类型:

缓冲

Writable和Readable流都会将数据存储到内部的缓存中。这些缓存可以通过相应的writable._writableState.getBuffer()或者readable._readableState.buffer来获取。 缓存的大小取决流构造函数的highWaterMark选项。对于普通的流, highWaterMark选项指定了总共的字节数。对于工作在对象模式的流,highWaterMark指定了对象的总数。

可写流

Write Streams 是destination的一种抽象,这种destination允许数据写入

Writable的例子包括了

Writeable流暴露了一些方法 比如write() end() pipe()方法

Writable类的事件和方法

可读流

Readable的例子

可读流的时间和方法

两种模式

可读流事实上工作在下面两种模式之一: flowing 和paused

在flowing模式下,可读流自动从系统底层读取数据,并通过EventEmitter接口的事件尽快将数据提供给应用

在paused模式下,必须显示调用stream,read()方法来从流中读取数据片段

所有初始工作位paused的Readable流,可以通过下面三种途径切换到flowing模式:

从Flowing模式切换到paused模式

三种状态

任意可读流应确切处于下面三种状态:

上一篇下一篇

猜你喜欢

热点阅读