从可读流类的read方法返回的默认字节数是多少?

问题描述 投票:0回答:1

以下代码段从文件中创建一个可读流,然后监听 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个字节,第二次读取了11个字节,文件大小为19个字节。它是不是应该一次读完19个字节?

javascript node.js file io stream
1个回答
2
投票

它是否会一直返回新行的标记,或者是一个部分结果

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

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

一个流使用一个内部缓冲区(你有一些控制权)。 调用 .read() 是非阻塞的。 它将返回它的缓冲区中所拥有的字节数,直到你要求的数量。 但是,如果缓冲区中没有太多的字节,特别是当你读到缓冲区的最后时,你绝对可以在流从文件中收到下一组字节之前得到部分结果。

所以,没有一个自动的 "默认 "值来规定第一次读取时有多少字节会准备好。 它取决于一系列的时间因素,包括从你打开流到你读的时间已经过去了多少时间,你的硬盘速度有多快,以及你的系统中CPU和IO的竞争有多大。 如果你有一小段时间不读,流应该会填满它的内部缓冲区。 如果你立即读取,它可能还没有把任何或很多东西放入缓冲区。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.