Наследственный поток; буферизация в Read () - PullRequest
3 голосов
/ 24 февраля 2009

Я унаследовал класс Stream, в котором я не знаю, как правильно реализовать функцию Read (), поэтому у меня не будет много вложенных if и сложного для отладки кода. Дело в том, что чтение из источника этого потока возвращает буфер постоянного размера (например, неизменяемый), но функция Read () принимает разные размеры буфера. Я хотя и добавил BufferedStream, но думаю, что это плохая идея. Спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 24 февраля 2009

Внутренний источник возвращает буферы фиксированного размера? Если это так, то это не совсем то, что делает 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);
}
0 голосов
/ 24 февраля 2009

Вот ваш «стартер на 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;
}

Не проверено, поэтому могут быть ошибки. Неясно, имеет ли ваш исходный поток длину, кратную его фиксированному размеру. Если нет, тогда для окончательного частичного буфера требуется дополнительная логика.

Основной принцип состоит в том, чтобы поддерживать свой собственный буфер фиксированного размера и отслеживать положение в этом буфере, которое до сих пор использовалось операциями чтения

...