开发者社区> 黎燃> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Node.js实战对于Buffer和Stream模块系统的深入剖析

简介: Node.js实战对于Buffer和Stream模块系统的深入剖析
+关注继续查看

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(); 

在这里插入图片描述

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
NODE.JS的基本系统模块操作样例
就练练手, 嘿嘿,说不定,写服务器脚本也可以哟。 console.log('Currently executing file is ' + __filename); console.log('It is located in ' + __dirname); console.
823 0
前端培训-中级阶段(47)- Node.js 10.x文件模块
前端最基础的就是 HTML+CSS+Javascript。掌握了这三门技术就算入门,但也仅仅是入门,现在前端开发的定义已经远远不止这些。前端小课堂(HTML/CSS/JS),本着提升技术水平,打牢基础知识的中心思想,我们开课啦(每周四)。
37 0
Node.js(一)概述、全局对象/函数、node各模块使用介绍
Node.js(一)概述、全局对象/函数、node各模块使用介绍
78 0
Node.js(三)路由器、中间件、MySQL模块、RESTful接口
Node.js(三)路由器、中间件、MySQL模块、RESTful接口
60 0
Node.js学习笔记(十五、Web模块)
Node.js学习笔记(十五、Web模块)
24 0
Node.js学习笔记(九、模块系统)
Node.js学习笔记(九、模块系统)
65 0
Node 02--Node中的模块系统与响应中文编码
Node 02--Node中的模块系统与响应中文编码
42 0
使用CoffeeScript编写Node.js 模块
Node.js 基于JavaScript编写应用,JavaScript是我的主要开发语言。CoffeeScript是编译为JavaScript的编程语言。为什么我们要用CoffeeScript来编写一段可重用的代码——模块呢?CoffeeScript是一个非常高阶的语言,将JavaScript、Ruby和Python中我最爱的部分结合在了一起。在本教程中,我将展示如何使用CoffeeScript为Node.js创建一个可复用的开源模块。最近我在创建一个播放列表分析模块时get了这个新技能。重点在于如何将一个快速的开发变成一个结构良好的Node.js模块。
60 0
技能学习:学习使用Node.js + Vue.js,开发前端全栈网站-12-1.管理员模块
网站的必备功能:用户登录。 用户登录功能是网站安全的一大重点,网站做的再好看,再完善,如果没有一个安全的管理员通道,都算不上一个成功的网站。今天起的几篇文章对用户登录进行专门学习。 本篇文章我们将管理员模块实现。
16 0
+关注
112
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载