Какое количество байтов по умолчанию возвращается из метода чтения класса потока для чтения? - PullRequest
0 голосов
/ 23 апреля 2020

Следующий фрагмент создает читаемый поток из файла и затем прослушивает событие readable, чтобы начать прием данных из потока.

    const rstream = fs.createReadStream(this.getFileName(), {
        encoding: "utf8"
    });

    /**
     * Reference: https://nodejs.org/api/stream.html#stream_readable_streams
     *
     * Adding a 'readable' event handler automatically make the stream to stop flowing,
     * and the data to be consumed via readable.read().
     */

    rstream.on("readable", () => {
        let data;
        while(data = rstream.read()) {
            console.log(data, " *");
        }
    });

Функция read принимает size аргумент, который является максимальным количеством байтов для чтения из потока чтения. Какое количество байтов по умолчанию возвращается из потока или как оно работает? Например, если в моем файле есть токены, разделенные символом новой строки, он всегда будет возвращать токены из новой строки или это может быть частичный результат, когда некоторые токены взяты из новой строки, а последний результат содержит только 2 символа из новой строки. ?

Обновление:

Я также читал об опции highWaterMark, которая, возможно, определяет размер порции для буферизованного потока. Как это работает. Я попробовал следующее:

    const rstream = fs.createReadStream(this.getFileName(), {
        encoding: "utf8",
        highWaterMark: 64 * 1024
    });

Значит ли это, что размер чанка будет не менее 64 * 1024 байтов? Когда я попытался прочитать файл описанной выше конфигурации для highWaterMark, программа прочитала 8 байт в первый раз и около 11 байт в следующий раз с размером файла 19 байт. Разве он не должен прочитать все 19 байтов одновременно?

1 Ответ

2 голосов
/ 23 апреля 2020

всегда будет возвращать токены из новой строки или может быть частичным результатом

Нет, не всегда будет возвращать полную строку. Вы должны быть готовы получить частичную линию. Если вам нужны построчные результаты, вы можете использовать интерфейс Readline , и он будет обрабатывать частичную буферизацию результатов и сообщать вам только о целой строке.

Что такое количество байтов, возвращаемых из потока по умолчанию или как это работает?

Поток использует внутренний буфер (который вы можете контролировать). Звонок на .read() неблокируемый. Он вернет столько байтов, сколько имеет в своем буфере, вплоть до запрашиваемой вами суммы. Но, если в буфере слишком мало байтов, особенно когда вы читаете в конце буфера, вы можете получить частичные результаты до того, как поток получит следующий набор байтов из файла.

Таким образом, не существует автоматического c значения «по умолчанию», сколько байтов будет готово при первом чтении. Это зависит от целого ряда временных соображений, в том числе от того, сколько времени прошло с момента открытия потока и когда вы читаете, и насколько быстро работает ваш накопитель, и насколько велика конкуренция за использование процессора и ввода-вывода в вашей системе. Если вы не читаете некоторое время, поток должен заполнить свой внутренний буфер. Если вы читаете сразу, возможно, он еще не поместил ни много, ни много в буфер.

Означает ли это, что размер фрагмента будет не менее 64 * 1024 байта?

Нет, это означает, что размер чанка будет не больше этого. Для читаемого потока highWaterMark определяет максимальный объем данных, которые поток будет буферизовать перед вашими фактическими вызовами read(). Как только поток заполняет этот буфер, он автоматически прекращает чтение, пока вы не прочитаете некоторые из этих данных из внутреннего буфера.

...