NodeJS читаемый поток - читаемое событие - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть читаемый поток, созданный fs.createReadStream('my-file.txt', { highWaterMark: 10 }). Я поглощаю его, слушая readable события, испускаемые самим потоком. Когда генерируется такое событие, я использую myStream.read(CHUNK_SIZE) для чтения из потока определенной длины.

Предположим, что поток имеет всего 20 байт и что мои CHUNK_SIZE = 11 байт.

  1. При первом выпуске события readable и первой попытке прочитать 11 байт Я получаю null в результате использования метода read, потому что просто - в буфере потока readableLength недостаточно данных, потому что HWM равен 10.
  2. HWM равен увеличено до ближайшей степени 2 больше 11. Это 16.
  3. readableLength теперь 10 + 16 = 26
  4. Событие readable отправляется еще раз.
  5. На этот раз достаточно данных в поток для чтения.
  6. Мы потребляем 11 байтов из потока. HWM по-прежнему 16, readableLength = 26 - 11 = 15
  7. Выпускается другое событие readable.

и т. Д. И т. П. *

В определенная точка myStream.readableLength будет больше, чем myStream.readableHighWaterMark, и это приведет к тому, что readable событий больше не будет генерироваться, а поток не будет полностью прочитан.

В качестве решения я добавил этот вид логики c в свой код:

        if (stream.readableHighWaterMark <= stream.readableLength) {
            stream.emit('readable');
        }

Мои вопросы:

  1. Это желаемое поведение потоки? И если да, то - почему
  2. Является ли мой обходной путь хорошим решением?
  3. Есть ли другое решение?
...