当我在Node.js中执行fs.createReadStream
时,数据似乎是64KB的块(我认为这在不同的计算机之间有所不同)。
假设我通过一系列转换(每个转换对单个块进行操作)将读流管道化,然后最终将其管道化为写流以将其保存到磁盘。。。
如果我事先知道我正在处理的文件保证每个文件都小于64KB(即,它们将在一个块中读取),那么与普通的旧异步代码相比,使用流有什么好处吗?
首先,您可以使用highWaterMark
参数来配置块大小:字节模式流默认为16k(对象模式流为16个对象),但fs.ReadStream
默认为64k块(请参阅相关源代码)。
如果你绝对确定你的所有数据都适合一个区块,那么使用流确实没有立竿见影的好处。
但请记住,流是灵活的;它们是代码的统一抽象:您可以从文件、套接字或随机生成器中读取数据。您可以在流管道中添加或删除双工流,您的代码仍将以相同的方式工作。
您还可以将一个可读流管道传输到多个可写流中,这将是一种只使用异步回调的痛苦…
还要注意的是,流不会同步发送数据(即readable
事件在下一次勾选时发出),这可以很好地处理同步调用异步回调的常见错误,从而产生可能的堆栈溢出错误。