在 Dart 中将文件作为字符串流读取:将发出多少个事件?

Posted

技术标签:

【中文标题】在 Dart 中将文件作为字符串流读取:将发出多少个事件?【英文标题】:Reading file as stream of strings in Dart: how many events will be emitted? 【发布时间】:2019-08-20 12:18:21 【问题描述】:

在 Dart 中将文件作为流打开的标准方法是使用file.openRead(),它返回一个Stream<List<int>>

下一个标准步骤是使用utf8.decoder SteamTranformer 转换此流,返回Stream<String>

我注意到,对于我尝试过的文件,这个结果流只发出一个事件,整个文件内容表示为一个字符串。但我觉得这不应该是一般情况,否则 API 不需要返回字符串流,Future<String> 就足够了。

您能否解释一下当此流发出多个事件时如何观察行为?这是否取决于文件大小/磁盘 IO 速率/某些缓冲区大小?

【问题讨论】:

【参考方案1】:

这取决于文件大小和缓冲区大小,但是文件操作是如何实现的。

如果您读取一个大文件,您很可能会收到多个大小有限的事件。 UTF-8 解码器急切地解码块,所以解码后你应该得到大致相同数量的块。它可能会携带几个字节跨越块边界,但其余字节会尽快解码。

在我的本地机器上检查,缓冲区大小似乎是 65536 字节。读取比这更大的文件会给我多个块。

【讨论】:

谢谢。我尝试过使用更大的文件,它会产生多个块。 在我的本地机器上,缓冲区大小也是 65536 字节。是平台实现决定了缓冲区大小还是 Dart?

以上是关于在 Dart 中将文件作为字符串流读取:将发出多少个事件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Dart中将UTF-8字符串转换为字节数组?

memorystream - 字符串流,字符串,其他?

如何在 C++ 中将文件中的段落作为单个字符串读取

如何在Nodejs中将字符串作为读取流对象传递?

如何在 Dart 中将 Navigator 函数作为参数传递?

是否可以将字符串流作为函数参数传递?