在 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 中将文件作为字符串流读取:将发出多少个事件?的主要内容,如果未能解决你的问题,请参考以下文章