写点什么

开源一夏 | Node.js 实战对于 Buffer 和 Stream 模块系统的深入剖析

作者:黎燃
  • 2022 年 8 月 17 日
    内蒙古
  • 本文字数:1772 字

    阅读完需:约 6 分钟

Buffer 缓冲区


JavaScript 语言本身只有字符串数据类型,没有二进制数据类型。但是,在处理 TCP 流或文件流时必须使用二进制数据。因此,在 node JS 中,定义了一个缓冲区类来创建用于存储二进制数据的缓冲区。


const buf = Buffer.from('runoob', 'ascii');
复制代码


在 node JS 中,缓冲区类是与 node 内核一起发布的核心库。缓冲库是 node JS 带来的一种存储原始数据的方法,它允许节点 JS。


console.log(buf.toString('hex'));console.log(buf.toString('base64'));
复制代码


原始数据存储在 buffer 类的实例中。缓冲区类似于整数数组,但它对应于 V8 堆内存之外的一段原始内存。

写入缓冲区

写入 Node 缓冲区的语法如下所示:


buf.write(string[, offset[, length]][, encoding])
复制代码


  • string - 写入缓冲区的字符串。

  • offset - 缓冲区开始写入的索引值,默认为 0 。

  • length - 写入的字节数,默认为 buffer.length

  • encoding - 使用的编码。默认为 'utf8' 。


buf = Buffer.alloc(256);len = buf.write("www.runoob.com");
console.log("写入字节数 : "+ len);
复制代码


输出为:


$node main.js 写入字节数 : 14


buf.write(string[, offset[, length]][, encoding])根据参数偏移量和指定的编码方法将参数字符串数据写入缓冲区。偏移量的默认值为 0,默认编码方法为 utf8。长度是要写入的字符串的字节大小。返回数字类型,指示写入了多少 8 位字节流。如果缓冲区没有足够的空间容纳整个字符串,它将只写入部分字符串。默认情况下,长度是缓冲区长度-偏移量此方法似乎无法写入某些字符。


buf.writeDoubleBE(value, offset[, noAssert])根据传递的偏移量和指定的 endian 格式将值写入缓冲区。注意:值必须是有效的 64 位双精度值。如果参数 noassert 为真,则不会验证值和偏移参数。这意味着该值可能太大,或者偏移量可能超过缓冲区的末尾,从而导致丢弃该值。默认值为 false。

从流中读取数据

var fs = require("fs");var data = '';
复制代码


创建可读流


var readerStream = fs.createReadStream('input.txt');
复制代码


设置编码为 utf8。


readerStream.setEncoding('UTF8');
复制代码


处理流事件 --> data, end, and error


readerStream.on('data', function(chunk) {   data += chunk;});
复制代码


readerStream.on('end',function(){   console.log(data);});
readerStream.on('error', function(err){ console.log(err.stack);});
console.log("程序执行完毕");
复制代码

管道流

管道为输出流到输入流提供了一种机制。通常我们使用它从一个流中获取数据并将其传递给另一个流。创建一个可读流


var readerStream = fs.createReadStream('input.txt');
复制代码


创建一个可写流


var writerStream = fs.createWriteStream('output.txt');
复制代码


管道读写操作,读取 input.txt 文件内容,并将内容写入到 output.txt 文件中。


readerStream.pipe(writerStream);
复制代码

链式流

链接是一种将输出流连接到另一个流并创建多个流操作链的机制。链流通常用于管道操作。接下来,我们使用管道和链来压缩和解压缩文件。


var fs = require("fs");var zlib = require('zlib');
复制代码


压缩 input.txt 文件为 input.txt.gz


fs.createReadStream('input.txt')  .pipe(zlib.createGzip())  .pipe(fs.createWriteStream('input.txt.gz'));
复制代码


执行上述操作后,我们可以看到输入 Txt 压缩文件 input.Txt.gz。接下来,让我们解压文件并创建解压 JS 文件,代码如下:


var fs = require("fs");var zlib = require('zlib');
复制代码


解压 input.txt.gz 文件为 input.txt


fs.createReadStream('input.txt.gz')  .pipe(zlib.createGunzip())  .pipe(fs.createWriteStream('input.txt'));
复制代码

模块系统

以便启用节点的文件。js 相互调用,节点。js 提供了一个简单的模块系统。模块是 JS 应用程序的基本组件,文件和模块是一一对应的。换句话说,node JS 文件是一个模块。该文件可以是 JavaScript 代码、JSON 或编译的 C/C++扩展。hello.js


function Hello() {     var name;     this.setName = function(thyName) {         name = thyName;     };     this.sayHello = function() {         console.log('Hello ' + name);     }; }; 
复制代码


模块接口中唯一的变化是使用模块 Exports=Hello,而不是 Exports world=function(){}当模块被外部引用时,其接口对象是要输出的 Hello 对象本身,而不是原始导出。


var Hello = require('./hello'); hello = new Hello(); hello.setName('BYVoid'); hello.sayHello(); 
复制代码



发布于: 刚刚阅读数: 2
用户头像

黎燃

关注

前端工程师 2022.05.06 加入

专注学习分享前端知识。

评论

发布
暂无评论
开源一夏  | Node.js实战对于Buffer和Stream模块系统的深入剖析_开源_黎燃_InfoQ写作社区