У меня есть читаемый поток, созданный fs.createReadStream('my-file.txt', { highWaterMark: 10 })
. Я поглощаю его, слушая readable
события, испускаемые самим потоком. Когда генерируется такое событие, я использую myStream.read(CHUNK_SIZE)
для чтения из потока определенной длины.
Предположим, что поток имеет всего 20
байт и что мои CHUNK_SIZE = 11
байт.
- При первом выпуске события
readable
и первой попытке прочитать 11
байт Я получаю null
в результате использования метода read
, потому что просто - в буфере потока readableLength
недостаточно данных, потому что HWM
равен 10
. HWM
равен увеличено до ближайшей степени 2
больше 11
. Это 16
. readableLength
теперь 10 + 16 = 26
- Событие
readable
отправляется еще раз. - На этот раз достаточно данных в поток для чтения.
- Мы потребляем
11
байтов из потока. HWM
по-прежнему 16
, readableLength = 26 - 11 = 15
- Выпускается другое событие
readable
.
и т. Д. И т. П. *
В определенная точка myStream.readableLength
будет больше, чем myStream.readableHighWaterMark
, и это приведет к тому, что readable
событий больше не будет генерироваться, а поток не будет полностью прочитан.
В качестве решения я добавил этот вид логики c в свой код:
if (stream.readableHighWaterMark <= stream.readableLength) {
stream.emit('readable');
}
Мои вопросы:
- Это желаемое поведение потоки? И если да, то - почему
- Является ли мой обходной путь хорошим решением?
- Есть ли другое решение?