process.stdinstream的可读和数据事件之间有什么区别?

说我有

process.stdin.setEncoding('utf8'); var myString = ''; 

有什么区别

 process.stdin.on('readable', function() { myString += process.stdin.read(); }); 

 process.stdin.on('data', function(chunk) { myString += chunk; }); 

如果inputstring一旦stdin结束,它们就会给我相同的myString

每个方面的最佳做法是什么? 谢谢

它们是两种不同的API,允许您访问相同的数据块stream。 'readable' API在节点0.10.0中作为“Streams 2”的一部分被引入,所以如果你search了它,它应该会有所帮助。 问题的核心是'readable'接口允许更简单的数据pipe理和缓冲。

'data'示例用一个块来调用你的函数,你别无select,只能去处理它,否则它将永远丢失。 在'readable'例子中,函数告诉你数据是可用的,但你可以随时阅读。 这使底层系统知道您是否已经处理了数据,因此支持称为背压的概念非常简单。

例如,在联网stream中,如果客户端通过TCP连接将数据发送到服务器,并且服务器超级繁忙,则它将接收readable事件,但是可以select等待读取数据直到其实际具有资源处理数据。 通过不读取数据,数据stream将缓冲数据,当缓冲区接近最大值时,数据stream将停止从操作系统读取数据包,以避免占用过多的RAM。 然后,操作系统将开始丢弃数据包,并且由于数据包被丢弃,正在发送数据的客户端将降低数据发送的速度,以减less丢弃的数据包。

这在旧版stream“V1”的实现中得到了技术支持,但要做得更难。

所以基本上,如果你想要大量的数据,使用'可读'或者devise你的数据stream是一个好主意,但是如果你只是从terminal读取数据,那么你可能会看到零差。