我正在阅读这篇文章:http://elegantcode.com/2011/04/06/taking-baby-steps-with-node-js-pumping-data-between-streams/以及在理解溪流方面有一些小麻烦。
报价:
"Suppose we want to develop a simple web application that reads a particular file from disk and send it to the browser. The following code shows a very simple and naïve implementation in order to make this happen."
因此代码示例如下:
var readStream = fileSystem.createReadStream(filePath);
readStream.on('data', function(data) {
response.write(data);
});
readStream.on('end', function() {
response.end();
});
当我们可以简单地做时,我们为什么要使用上面的方式
fs.readFile(filePath, function(err, data){
response.write(data);
response.end();
});
我何时或为什么要使用流?
在处理大文件时会使用流。使用回调,文件的所有内容必须同时加载到内存中,而使用流,在任何给定时间只有文件的一块在内存中。
此外,流接口可以说更优雅。您可以使用pipe
:,而不是显式附加data
、drain
和end
回调
var readStream = fileSystem.createReadStream(filePath);
readStream.pipe(response);
一个重要原因是,您可以在数据全部进入内存之前就开始对其进行处理。想想"流媒体视频",在那里你可以在剪辑仍在加载时开始观看。在许多用例中,流将允许您在加载整个文件之前开始处理文件中的数据。
另一种常见的用例是,您只想读取一个对象,直到检测到数据中的某些条件。假设您需要检查一个大文件中是否包含单词"rabbit"。如果使用回调模式,则需要将整个文件读取到内存中,然后遍历文件并检查单词是否在其中。对于流,您可能会在文件的第5行检测到单词,然后您就可以关闭流,而无需加载整个内容。
显然,还有许多更复杂的用例,而且在很多情况下,回调仍然更简单(例如,如果您需要计算"rabbit"出现的总次数,在这种情况下,您无论如何都必须加载整个文件)。