Node.js 使用流从TextFile读取数据

示例

节点中的I / O是异步的,因此与磁盘和网络进行交互需要将回调传递给函数。您可能会想编写这样的代码来为磁盘中的文件提供服务:

var http = require('http');
var fs = require('fs');

var server = http.createServer(function (req, res) {
    fs.readFile(__dirname + '/data.txt', function (err, data) {
        res.end(data);
    });
});
server.listen(8000);

这段代码可以工作,但是它很庞大,并且data.txt在将结果写回到客户端之前,会针对每个请求将整个文件缓冲到内存中。如果data.txt很大,您的程序可能会开始吞噬大量内存,因为它会同时为许多用户提供服务,尤其是对于连接速度较慢的用户。

用户体验也很差,因为用户将需要等待整个文件被缓冲到服务器上的内存中,然后才能开始接收任何内容。

幸运的是,两个(req,res)参数都是流,这意味着我们可以使用代替来以更好的方式编写:fs.createReadStream()fs.readFile()

var http = require('http');
var fs = require('fs');

var server = http.createServer(function (req, res) {
    var stream = fs.createReadStream(__dirname + '/data.txt');
    stream.pipe(res);
});
server.listen(8000);

这里 。pipe()负责侦听来自的“数据”和“结束”事件。此代码不仅更简洁,而且现在从磁盘接收到文件后,将立即一次将文件一次写入客户端。fs.createReadStream()data.txt