dart - 如何读取分块流的一部分
问题描述
在 Dart 中,stdin
是一个Stream<List<int>>
. 字节以块的形式出现。我想要的是一个函数,它从标准输入读取直到我得到一些字符(比如'\0'
),然后返回,以便标准输入的未来读者在'\0'
.
不幸的是,由于分块,'\0'
字节可能位于块的中间,所以我有点想读取一个块,删除其中的一部分,然后将其推回流的开头。但是没有任何方法可以做到这一点。
另一种选择是readByteSync()
,但一次读取一个字节会很慢,这是在 GUI 程序中,所以我不能使用同步方法。
解决方案
我认为实际上因为 aStream<>
只能被收听一次——即使之前的监听器取消了它的订阅——唯一的方法是让一些东西永久地过滤流的事件,直到时间结束。因此,您不妨将流拆分为两个流:
import 'dart:async';
class StdioPreambleSplitter {
StdioPreambleSplitter(this._input) {
var preambleFinished = false;
_input.listen((chunk) {
if (preambleFinished) {
_dataStream.add(chunk);
} else {
final nullByte = chunk.indexOf(0);
if (nullByte == -1) {
_dataStream.add(chunk);
} else {
preambleFinished = true;
_preambleStream.add(chunk.sublist(0, nullByte));
_dataStream.add(chunk.sublist(nullByte));
}
}
});
}
Stream<List<int>> preambleStream() {
return _preambleStream.stream;
}
Stream<List<int>> dataStream() {
return _dataStream.stream;
}
final Stream<List<int>> _input;
final StreamController<List<int>> _preambleStream = new StreamController();
final StreamController<List<int>> _dataStream = new StreamController();
}
希望它不会增加太多开销。
推荐阅读
- java - Json 输出排除字段名称,但包括其类字段
- python - 我得到一个 [DEBUG] worker: 使用 Guncorn3 发布我的烧瓶应用程序时 SIGWINCH 忽略错误
- woocommerce - 在 WooCommerce 中隐藏添加到购物车按钮但显示库存状态
- ios - 如何将依赖关系传递给 URLProtocol 子类?
- asp.net-mvc - 如何解决rzc生成退出代码1错误
- apache-spark - 如何使用 spark rdd 获得以下列表?
- ios - 如何在 xcode 项目中将私有远程 gitlab 存储库(自托管)集成为 swift 包管理器?
- huawei-mobile-services - 华为账号登录agc失败代码203817988出现错误
- vue.js - 从 vuex 操作访问 $root 实例
- c - 根据 C 标准将函数强制转换为指向各种函数的指针是否合法?