2

我有一个IInputStream我想从中读取数据,直到遇到某个字节,此时我将把它传递IInputStream给其他对象以消耗流的其余部分。

这就是我想出的:

public async Task HandleInputStream(IInputStream instream)
{
    using (var dataReader = new DataReader(instream))
    {
        byte b;
        do
        {
            await dataReader.LoadAsync(1);
            b = dataReader.ReadByte();

            // Do something with the byte
        } while (b != <some condition>);

        dataReader.DetachStream();
    }
}

似乎一次运行LoadData一个字节会非常慢。我的困境是,如果我选择一个缓冲区大小(如 1024)并加载它,并且我的值显示为 10 个字节,那么此方法将具有下一个 1014 个字节的数据,并且必须将其传递给下一个方法进行处理.

有没有更好的方法来解决这个问题,或者这是一个可以接受的解决方案?

4

1 回答 1

2

如果您要查找的值距离流的开头不是太远,那么这种读取应该不会那么慢。您期望它在流中有多远?你测试过性能吗?

根据您使用的流类型,您可能可以使用其他方法:

  • 如果它支持向后搜索(例如,您正在从文件中读取),您可以一次读取更大的块,只要您知道在什么偏移处找到了您的值。然后,您可以在将其移交之前将其搜索到该位置。
  • 如果这不可能,您可以创建另一个中间内存流,您可以将已读取的缓冲区的剩余部分复制到其中,然后复制该流的其余部分。即使您无法向后寻找,这也有效。如果流太大,唯一的问题可能是内存消耗。
于 2012-11-30T05:47:50.680 回答