医生readableStream.read(size)
说,
如果 size 字节不可用,则它将返回 null。
为了测试这一点,我做了:
// in test.js
process.stdin.on('readable', function(){
var d = this.read(30);
if (d) console.log(d.toString());
});
$ (echo abc; sleep 1; echo def; sleep 1; echo ghi) | node test.js
输出如下:
abc
def
ghi
我希望代码打印null
,因为size(30)
大于写入的字节数。为什么不打印null
?
根据@hexacyanide 的评论,我重写了如下代码,并再次运行测试:
process.stdin.on('readable', function() {
var d = this.read(300);
if (d === null) {
console.log("NULL")
} else {
console.log(d.toString());
}
});
process.stdin.on('end', function() {
console.log('END EVENT')
});
测试输出:
NULL
NULL
NULL
abc
def
ghi
END EVENT
我现在可以理解输出直到 3 NULL's
。
之后,根据输出我有几个问题:
- 为什么我得到
abc\ndef\nghi
了第一次测试的输出?我问这个是因为即使在推abcdefghi
送到流之后,它的缓冲区长度仍然是 9。所以如果我在任何给定时间读取,读取操作应该返回null
。可以肯定的是,我将读取大小设置为 300。 - 流如何知道我已完成所有推送?