【发布时间】:2010-04-14 22:20:40
【问题描述】:
我在流和缓冲区方面没有太多经验,但我必须为一个项目做这件事,当我正在读取的流是我选择的缓冲区大小。让我告诉你:
我的代码首先从流中读取 bufferSize(假设是 100 个)字节:
numberOfBytesRead = DataReader.GetBytes(0, index, output, 0, bufferSize);
然后,我循环一个while 循环:
while (numberOfBytesRead == bufferSize)
{
BufferWriter.Write(output);
BufferWriter.Flush();
index += bufferSize;
numberOfBytesRead = DataReader.GetBytes(0, index, output, 0, bufferSize);
}
...而且,一旦我们读取到 non-bufferSize,我们就知道我们已经到达流的末尾并且可以继续前进。
但如果 bufferSize 为 100,流为 200,我们将读取位置 0-99、100-199,然后尝试读取 200-299 错误。如果它返回 0,我会喜欢它,但它会引发错误。我正在做的事情是,好吧,一个尝试捕获:
catch (System.IndexOutOfRangeException)
numberOfBytesRead = 0;
...结束循环,并成功完成事情,但我们都知道我不想通过错误处理来控制代码流。
当流长度未知时,是否有更好(更标准?)的方式来处理流读取?这似乎是一个相当合理的阅读流策略中的一个小皱纹,但我只是不知道我是不是弄错了。
这个的细节(我已经清理了一点)是一个 MySqlDataReader 命中一个 LARGEBLOB 列。只要缓冲区大于返回的字节数,或者返回的字节数不是是bufferSize 的倍数,它就会起作用。因为在这种情况下,我们不会抛出IndexOutOfRangeException。
【问题讨论】:
标签: c# streaming buffer sqldatareader binary-data