javascript - 从可读流类的 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 个字节吗?
解决方案
它是否总是从新行返回标记,或者可能是部分结果
不,它不会总是返回一个完整的行。您必须准备好获得部分线路。如果你想要逐行结果,你可以使用Readline 接口,它会处理部分结果缓冲,只有当它有整行时才会告诉你。
从流返回的默认字节数是多少,或者它是如何工作的?
流使用内部缓冲区(您可以对其进行一些控制)。调用.read()
是非阻塞的。它将返回与其缓冲区中的字节数一样多的字节,最多为您要求的数量。但是,如果缓冲区中没有很多字节,特别是当您读取缓冲区末尾时,您绝对可以在流从文件中接收到下一组字节之前获得部分结果。
因此,对于第一次读取时准备好多少字节,没有自动“默认”值。这取决于一大堆时间考虑因素,包括从您打开流以来已经过去了多少时间,何时阅读,您的驱动器有多快,以及系统上的 CPU 和 I/O 有多少争用。如果您有一段时间不阅读,则流应该填充其内部缓冲区。如果您立即阅读,它可能还没有将任何或太多放入缓冲区。
这是否意味着块大小将不小于 64 * 1024 字节?
不,这意味着块大小不会大于该大小。对于可读流,highWaterMark 确定流将在实际read()
调用之前缓冲的最大数据量。一旦流填满该缓冲区,它就会自动停止读取,直到您从内部缓冲区中读取一些数据。
推荐阅读
- javascript - 如何更改仅带有弹出窗口的活动选项卡的 Chrome 扩展程序图标?
- angular - Angular - 输入在 Enter 按下时被删除,因为调用“删除”功能,而不是预期的焦点
- python - 如何使带有 Oauth 的 python 命令行工具在 lambda 中工作?
- python-3.x - Python3 理解列表赋值(浅/深拷贝或参考)
- amazon-s3 - 带有ansible的重定向规则S3
- powershell - 如何在 powershell 命令上设置超时?
- ios - getDocuments() 函数多次获取相同的数据
- visual-studio - 如何使扩展菜单图标适应 Visual Studio 主题?
- flutter - Flutter 读取实时数据库
- python - 如何在不更改 python matplotlib 中的热图的情况下更改颜色条的值?