Выбор ответа Middle Потоки и буферы обновлено

Склейка текста из чанков

Вопрос

Что не так в этом коде чтения UTF-8 файла?

let text = '';
stream.on('data', (chunk) => { text += chunk; });
stream.on('end', () => console.log(text));

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Многобайтовый символ может разорваться между чанками. text += chunk превращает каждый буфер в строку отдельно.

Варианты ответа

  1. Многобайтовый символ может разорваться между чанкамиправильный ответ
  2. Ничего, это эталонный способ чтения файла целиком
  3. Событие end не срабатывает без вызова pipe
  4. += строки с буфером бросит TypeError

Разбор

text += chunk превращает каждый буфер в строку отдельно. Если граница чанка попала в середину двухбайтовой буквы, обе половинки декодируются как мусор. Правильно: stream.setEncoding("utf8") (декодер склеит хвосты сам) или копить буферы и в конце Buffer.concat(chunks).toString().

  • end срабатывает, когда все данные прочитаны в flowing-режиме, pipe не нужен.
  • Конкатенация строки с буфером не бросает ошибку, она вызывает toString().

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.