首页 > 解决方案 > 从可读流类的 read 方法返回的默认字节数是多少?

问题描述

以下代码段从文件创建可读流,然后侦听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 个字节吗?

标签: javascriptnode.jsfileiostream

解决方案


它是否总是从新行返回标记,或者可能是部分结果

不,它不会总是返回一个完整的行。您必须准备好获得部分线路。如果你想要逐行结果,你可以使用Readline 接口,它会处理部分结果缓冲,只有当它有整行时才会告诉你。

从流返回的默认字节数是多少,或者它是如何工作的?

流使用内部缓冲区(您可以对其进行一些控制)。调用.read()是非阻塞的。它将返回与其缓冲区中的字节数一样多的字节,最多为您要求的数量。但是,如果缓冲区中没有很多字节,特别是当您读取缓冲区末尾时,您绝对可以在流从文件中接收到下一组字节之前获得部分结果。

因此,对于第一次读取时准备好多少字节,没有自动“默认”值。这取决于一大堆时间考虑因素,包括从您打开流以来已经过去了多少时间,何时阅读,您的驱动器有多快,以及系统上的 CPU 和 I/O 有多少争用。如果您有一段时间不阅读,则流应该填充其内部缓冲区。如果您立即阅读,它可能还没有将任何或太多放入缓冲区。

这是否意味着块大小将不小于 64 * 1024 字节?

不,这意味着块大小不会大于该大小。对于可读流,highWaterMark 确定流将在实际read()调用之前缓冲的最大数据量。一旦流填满该缓冲区,它就会自动停止读取,直到您从内部缓冲区中读取一些数据。


推荐阅读