В целом, использование события data
и предоставление потоку такой возможности доставить вам все данные проще и с меньшей вероятностью могут привести к проблемам. Это было бы моей рекомендацией, если только нет очень конкретной c причины, по которой вам нужно использовать событие readable
и читать данные самостоятельно.
Когда вы используете событие readable
и myStream.read()
, у вас есть читать все, что есть, пока вы не получите null
назад из чтения, указывающего, что буфер сейчас пуст. В противном случае вы застрянете в ожидании следующего события readable
, которое не наступит. От do c для .read()
он говорит следующее:
В то время как l oop необходимо при обработке данных с readable.read (). Только после того, как readable.read () вернет null, будет «readable».
Вот простая демонстрация. Просто укажите это на большой файл (скажем, 100 КБ):
const fs = require('fs');
let stream = fs.createReadStream("vlc-help.txt");
stream.on('readable', () => {
let data = stream.read(10)
console.log(data);
});
Когда я запускаю его, указывая на файл размером 343 080 байт, я вижу такой вывод:
<Buffer ef bb bf 55 73 61 67 65 3a 20>
<Buffer 76 6c 63 20 5b 6f 70 74 69 6f>
Я только получить два читаемых события, а затем он останавливается.
Когда я вставляю рекомендуемое while()
l oop, например:
const fs = require('fs');
let stream = fs.createReadStream("vlc-help.txt");
stream.on('readable', () => {
let data;
while (data = stream.read(10)) {
console.log(data);
}
});
Я получаю длинный поток данные, пока весь файл не будет прочитан.