【问题标题】:What is the default number of bytes returned from read method of readable stream class?从可读流类的 read 方法返回的默认字节数是多少?
【发布时间】:2020-08-06 05:37:49
【问题描述】:

下面的 sn -p 从文件中创建一个可读流,然后监听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 个字节吗?

【问题讨论】:

    标签: javascript node.js file io stream


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-04
      • 1970-01-01
      • 2023-01-16
      • 2013-07-06
      • 1970-01-01
      相关资源
      最近更新 更多