美文网首页
【翻译】Node.js 教程 —— 读取流

【翻译】Node.js 教程 —— 读取流

作者: kyuan | 来源:发表于2018-12-07 23:00 被阅读17次

上节课我们看到了 Stream 与 Buffers 背后的原理,这节课会讲关于在 Node.js 中如何创建自定义流

Node.js 中可以创建多种流,如读取流写入流,这两者区别是什么?

  • 写入流允许 Node.js 发送或者写入数据到流中
  • 读取流允许 Node.js 读取数据到流中

另外还可以创建第三种流,就是既能读也能写的流,叫双工流

想象一下,当我们发送响应(数据)到客户端。这是创建写入流的场景,将数据写入到流中,客户端(浏览器)通过流进行获取。反之亦然,如果 Node 从文件或者请求获取数据使用读取流。

开始例子吧,创建一个 readme.txt 文本文件,里面需要放大量文本内容以供读取流读取。

接着使用 fs 模块来创建读取流,我们曾使用过这个模块来读取文件,这次则是以流的方式进行读取。

var fs = require('fs');

fs.createReadStream(__dirname + '/readme.txt');

读取的数据将会分成小块填满 Buffers,Buffers 填满后会将数据通过流的方式传递,实质上就是分割大份的数据为小份,然后一份一份的传递给流。

我们需要做的是识别这些返回来的小块的数据。由于流继承自事件发生器,可以使用 data 事件监听数据的返回情况,并注册一个回调函数,每当数据返回则执行该回调函数

'app.js'
var fs = require('fs');

var readStream = fs.createReadStream(__dirname + '/readme.txt');
readStream.on('data', function(chunk){
  console.log('new chunk received:');
  console.log(chunk);
});
node app

执行 app.js 你会发现文本的内容会被分割成两个(个数根据文本内容而定)<buffer>,每当一个 Buffer 被填满后,会将里面的数据(chunk)打印到控制台上。

chunk

需要将这些看不懂的 chunk 转为文本内容,方法后加入编码方式 utf8

'app.js'
var fs = require('fs');

var readStream = fs.createReadStream(__dirname + '/readme.txt', 'utf-8');
readStream.on('data', function(chunk){
  console.log('new chunk received:');
  console.log(chunk);
});

这就是通过 stream 的方式读取数据,每当获取部分数据时即可马上使用。对比之前学习过的 fs.readFilefs.readFile 是读取整份数据到内存中,完成后才执行之后的程序。前者的好处是我们可以通过 writeStream 将先返回的部分数据传给用户,要比等待所有数据都拿到更好。

相关文章

网友评论

      本文标题:【翻译】Node.js 教程 —— 读取流

      本文链接:https://www.haomeiwen.com/subject/vphncqtx.html