继承流;在Read()中缓冲

时间:2009-02-23 22:10:14

标签: c# stream buffer

我继承了Stream类,其中我不知道如何正确实现Read()函数,所以我不会最终得到很多嵌套ifs并且难以调试代码。关键是从该流的源读取返回恒定大小的缓冲区(例如,不可更改),但Read()函数接受不同的缓冲区大小。我虽然添加了BufferedStream,但我认为这是个坏主意。谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

内部源返回固定大小的缓冲区?如果是这种情况,那不是BufferedStream所做的那样 - 那只会减少对物理流的调用次数。你需要一个单独的机制来缓存 - 你填充的MemoryStream和空是一个合理的选择。例如(完全未经测试):

MemoryStream localBuffer = new MemoryStream();
bool ReadNextChunk()
{
    // clear
    localBuffer.Position = 0;
    localBuffer.SetLength(0);
    // get data
    byte[] chunk = null; // TODO - read from source
    if(chunk == null || chunk.Length == 0) return false; // EOF
    localBuffer.Write(chunk, 0, chunk.Length);
    localBuffer.Position = 0;
    return true;
}
public override int Read(byte[] buffer, int offset, int count)
{
    int bytes;
    if ((bytes = localBuffer.Read(buffer, offset, count)) > 0) return bytes;
    if (!ReadNextChunk()) return 0;
    return localBuffer.Read(buffer, offset, count);
}

答案 1 :(得分:0)

这是你的“10人入门”(不确定是否全球翻译)。

byte[] myBuffer = new byte[fixedSize];
int myBufferPos = fixedSize;

public int Read(byte[] buffer, int offset, int count)
{
    int copiedCount = 0
    while (copiedCount < count)
    {
        if (myBufferPos >= fixedSize)
        {
            //Read new fixed buffer into myBuffer
            // use break on no more buffer.
            myBufferPos = 0;
        }

        int bytesToCopy = fixedSize - myBufferPos;
        if (bytesToCopy > count - copiedCount)
            byteToCopy = count - copiedCount;

        Array.Copy(myBuffer, myBufferPos, buffer, offset, byteToCopy);

        offset += bytesToCopy;
        myBufferPos += bytesToCopy;
        copiedCount += bytesToCopy;
    }

    return copiedCount;
}

未经测试可能会有一些错误。目前还不清楚您的源流的长度是否为其固定大小的精确倍数。如果没有,则最终的部分缓冲区需要一些额外的逻辑。

基本原则是维护自己的固定大小的缓冲区,并跟踪到目前为止读取消耗的缓冲区中的位置