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

ste*_*mao 34 javascript buffer stdin stream node.js

说我有

process.stdin.setEncoding('utf8');
var myString = '';
Run Code Online (Sandbox Code Playgroud)

有什么区别

process.stdin.on('readable', function() {
  myString += process.stdin.read();
});
Run Code Online (Sandbox Code Playgroud)

process.stdin.on('data', function(chunk) {
  myString += chunk;
});
Run Code Online (Sandbox Code Playgroud)

如果stdin结束后输入字符串相同,它们会给我相同的myString

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

log*_*yth 45

它们是两个不同的API,允许您访问相同的数据块流.该'readable'API是在节点0.10.0介绍为"流2"的一部分,因此,如果您搜索,它应该帮助.该问题的核心是该'readable'接口允许更简单的数据管理和缓冲.

'data'示例使用块调用您的函数,您别无选择,只能处理它,否则它将永远丢失.在该'readable'示例中,该函数告诉您数据可用,但您可以随时阅读它.这允许底层系统知道您是否已处理数据,因此支持称为背压的概念非常简单.

例如,在网络流中,如果客户端通过TCP连接向服务器发送数据并且服务器超级忙,它将接收readable事件,但是它可以选择等待读取数据,直到它实际拥有资源为止.处理数据.通过不读取数据,流将缓冲它,并且当缓冲区接近最大大小时,流将停止从操作系统读取数据包以避免占用太多RAM.然后操作系统将开始丢弃数据包,并且由于数据包被丢弃,发送数据的客户端将降低其发送数据的速度,以尝试减少数据包丢失.

旧的流"V1"实现在技术上支持这一点,但这样做要困难得多.

所以基本上,如果你期望大量的数据,使用"可读"或设计你的流是一个非常好的主意,但如果你只是从终端读取数据,那么你很可能会看到零差异.