上节课我们看到了 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 转为文本内容,方法后加入编码方式 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.readFile
,fs.readFile
是读取整份数据到内存中,完成后才执行之后的程序。前者的好处是我们可以通过 writeStream 将先返回的部分数据传给用户,要比等待所有数据都拿到更好。
网友评论