我正在阅读这篇文章: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();
});
何时或为何使用流?
答案 0 :(得分:13)
使用大型文件时,您会使用流。使用回调,所有文件的内容必须立即加载到内存中,而对于流,在任何给定时间只有一大块文件在内存中。
此外,流界面可以说更优雅。您可以改为使用pipe
而不是明确附加data
,drain
和end
回调:
var readStream = fileSystem.createReadStream(filePath);
readStream.pipe(response);
答案 1 :(得分:5)
一个重要原因是,您可以在数据全部存储之前开始处理数据。想想“流媒体视频”,你可以在它仍在加载时开始观看剪辑。在许多用例中,流可以让您在加载整个文件之前开始处理文件中的数据。
另一个常见的用例是,在您检测到数据中的某些条件之前,您只想读取一个对象。假设你需要检查一个大文件是否包含“兔子”这个词。如果使用回调模式,则需要将整个文件读入内存,然后浏览该文件并检查该单词是否在内部。使用流,您可以检测文件第5行上的单词,然后您就可以关闭流,而无需加载整个内容。
显然有许多更复杂的用例,并且仍然有很多次回调仍然对简单性更有意义(例如,如果你需要计算“兔子”出现的总时间,在这种情况下你必须无论如何加载整个文件。)