2009-02-23 5 views
3

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

ответ

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

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

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