系统性学习 Nodejs(4)—— Buffer
发布网友
发布时间:2024-09-30 09:26
我来回答
共1个回答
热心网友
时间:2024-12-13 09:12
在 Node 中,我们常需处理二进制数据,如文件操作、图片处理、网络 IO 等。为此,Node 引入了 Buffer,一个存储二进制数据的特殊对象,提供了操作二进制数据的能力。
非科班程序员可能对二进制数据较为陌生,以下简单介绍。计算机数据存储单位为字节,每个字节由8位组成。数字转换为二进制,以十进制 8 为例,转换为二进制为1 0 0 0,存储结构由8位组成,空余位补零。
数字进制包括10、8、16等,以10进制为例,数字8转换为二进制为1 0 0 0。英文字符存储通过ASCII表将每个字符对应值转为二进制,汉字则根据GBK规范转换,每个汉字占用两个字节,因汉字数量众多,需更复杂编码。
为容纳所有字符,Unicode国际组织制定了编码规范,包含所有字符,采用4个字节表示,解决了字符集问题。针对Unicode的变长字符编码方式,不同语言字符采用不同字节数编码。
Buffer类提供了多种方法,例如使用Buffer.from(string)创建Buffer实例,支持多种编码方式,如ASCII码。Buffer.from(array|arrayBuffer|buffer)、Buffer.alloc(size[, fill[, encoding]])、Buffer.allocUnsafe(size)等方法分别用于创建指定大小的Buffer实例、无填充Buffer实例。
Buffer写入使用buf.write(string[, offset[, length]][, encoding]),返回实际写入的长度;读取使用buf.toString([encoding[, start[, end]]])。Buffer合并使用Buffer.concat(list[, totalLength]),返回多个成员合并的新Buffer对象;裁剪使用buf.slice([start[, end]]),返回与旧Buffer执行同一块内存的新Buffer实例。
Buffer主要用于处理二进制数据,如文件操作。例如,实现文件拷贝功能时,若文件体积庞大,内存*可能导致程序卡死。借助Buffer,每次读取文件部分数据,写入到Buffer,再从Buffer写入文件,有效解决内存*问题。这是流(stream)的核心思路。