gpt4 book ai didi

dart - 如何读取分块流的一部分

转载 作者:行者123 更新时间:2023-12-03 03:04:01 26 4
gpt4 key购买 nike

在 Dart 中,stdinStream<List<int>> .字节以 block 的形式出现。我想要的是一个函数,它从 stdin 读取直到我得到一些字符(比如 '\0' ),然后返回,以便 stdin 的 future 读者获得 '\0' 之后的数据.

不幸的是,由于分块,'\0' byte 可能在一个 block 的中间,所以我有点想读取一个 block ,删除它的一部分,然后将它推回流的开头。但是没有任何方法可以做到这一点。

另一个选项是 readByteSync()但是一次读取一个字节会很慢,而且这是在 GUI 程序中,所以我不能使用同步方法。

最佳答案

我认为实际上是因为 Stream<>只能被收听一次——即使之前的收听者取消了订阅——唯一的方法是让一些东西永久地过滤流的事件,直到时间结束。所以你也可以将流分成两个流:

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();
}

希望它不会增加太多开销。

关于dart - 如何读取分块流的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62370797/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com