Bufferjavascript
前面说起到一些关于buffer类的问题,当时不是很明确 那么就次机会顺便深刻探讨一下这个东西到底干吗的出如今何时,如何使用.昨天跟朋友聊天他说我每一篇博文内容太长太长了 虽然很精细,可是的确深刻的有点多了,so 这篇开始尽可能多分几篇共同讨论,减小单一文章内容过多的问题哈. 想起个事儿来这,这两篇博文其实都是在深挖原生模块fs,原生若是操做文件的,细心的孩砸都会发现的,对于fs模块学习还有两章,我准备这两张完事儿以后开始学习http模块 目前项目中有用到部分http模块的功能,好了不废话了继续往下看.php
上篇文章围绕数据文件操做探讨了一下node里面如何操做文件的,可是javascript中只有字符串类型,并不支持二进制(文件操做都是二进制类型的,这也就解决了读取文件时候为啥不区分文件类别的问题,由于无论啥文件txt,php等等内容都会当作二进制数据取处理,我的理解啊并不表明官方解释),抢到的node工程师们确定不能容忍这么low的问题,所以buffer诞生了,buffer说是一个类,更准确的说是一个缓存区域!它在内存中的做用就是单独存放二进制说的区域.在nodejs中buffer是随着node一同发布的核心库,他是存在于V8堆内存以外的一块原始内存中.而这个内存大小在官方文档中也有说明:html
目前,V8引擎有一个默认的32位系统512MB内存的限制,在64位系统1.4gb。极限可提升设置- max_old_space_size到最大~ 1024(~ 1 GB)(32位)和4096(~ ~ 4GB)(64位),但建议你把你的单过程分红几个工人若是你命中内存限制。java
可是Buffer是若是回收的如何设定有效时间期限的真的很难找到相关文章,不过确实会被GC回收,相关文章我就再也不这里贴出来了关于这方面的文章真的太少了..彷佛没人去挖这个仍是不值得去挖呢?node
buffer类的建立相似于建立数组 :redis
var b=new buffer(10); //建立一个10字节的实例npm
var b=new buffer([1,2,3])//固然里面也能够是数组数组
var b=new buffer("嘿嘿嘿","utf-8")//这个也能够有 并且还设定了编码方式缓存
buffer.write数据结构
buf.write(string,[offset],[length],[encoding]),写入buffer的参数,string 须要写入的字符串,offset 缓存区开始的索引值,length 写入长度(固然若是缓存区满了就只能写入部分啦),encoding 编码方式 默认UTF-8
一个小李子:
buf = new Buffer(256); len = buf.write("www.w3cschool.cn"); console.log("写入字节数 : "+ len);
这个缓存方式有点点像redis,可是它并无有效期啊什么什么的,并且格式也是截然不同,给个人感受这个写入缓存区的就是一个txt文本...啥都是一行里面一直写下去可是如何找到指定的内容呢?
bufffer.toString
是否是感受很low比...别忘了 人家也是有参数的buffer.toString(encoding,start,end),你写在什么位置了直接取呗来来上例子看一下瞬间明白了:
buf = new Buffer(26); for (var i = 0 ; i < 26 ; i++) { buf[i] = i + 97; } console.log( buf.toString('ascii')); // 输出: abcdefghijklmnopqrstuvwxyz console.log( buf.toString('ascii',0,5)); // 输出: abcde console.log( buf.toString('utf8',0,5)); // 输出: abcde console.log( buf.toString(undefined,0,5)); // 使用 'utf8' 编码, 并输出: abcde
好了额,还有不少灰常灰常简单的方法,例如: 比较compare,合并concat,复制copy,剪切slice 我就不一一介绍了,看看文档简直不要再简单了...http://www.w3cschool.cn/nodejs/x1u41ith.html
这里我要说一下它的不少不少转换方法,前面也说到了实际上buffer缓存区域是有大小的并且是有回收机制的(虽然不清楚)大小确定是有限制的能省点就省点先介绍一下转换方法:
阅读Buffer的API文档时,咱们会发现更多的是readXXX()
和writeXXX()
开头的API,具体以下:
这些API为在Node.js中操做数据提供了极大的便利。假设咱们要将一个整形数值存储到文件中,好比当前时间戳为1447656645380
,若是将其看成一个字符串存储时,须要占用11字节的空间,而将其转换为二进制存储时仅需6字节空间便可:
var buf = new Buffer(6); buf.writeUIntBE(1447656645380, 0, 6); // <Buffer 01 51 0f 0f 63 04> buf.readUIntBE(0, 6); // 1447656645380
这段来自另一位大神一年前的博客了而且根据取出数据结构被混乱特地写了一个模块去解决这个问题lei-proto 有时间膜拜一下,传送门-->http://cnodejs.org/topic/56499568d28aa64101600fdc
编码转换
这里主要是介绍一下中文转换我接触的两个第三方库,不少人都在用与其一直用新东西探索未知区域我更愿意相信旧的,毕竟千万人都使用过..不废话了
前面常常用到toString()这个方法而node自己对中文以及其余多字节编码支持并很差,须要第三方库来协调一下,这里主要介绍一下经常使用的iconv-lite和encoding
iconv-lite
首先先来了解一下iconv, iconv-lite,encoding:
iconv:是在类Unix系统中一种标准字符集转换接口,用于在不一样字符集编码之间进行转换,最先出如今HP-UX系统中,阐释了node-iconv的起源.
var iconv = require('iconv-lite'); // Convert from an encoded buffer to js string. str = iconv.decode(buf, 'win1251'); // Convert from js string to an encoded buffer. buf = iconv.encode("Sample input string", 'win1251'); // Check if encoding is supported iconv.encodingExists("us-ascii")
encoding 须要绕个小丸子,encoding模块就一个方法convert(),使用方法为:encoding.convert(text, toCharset, fromCharset)。
var encoding = require('encoding'); var result = encoding.convert("ÕÄÖÜ", "Latin_1"); console.log(result); //<Buffer d5 c4 d6 dc>