Я унаследовал класс Stream, в котором я не знаю, как правильно реализовать функцию Read(), поэтому я не буду вдаваться в много вложенных ifs и отлаживать код. Дело в том, что чтение из источника этого потока возвращает буфер с постоянным размером (например, не изменяемый), но функция Read() принимает разные размеры буфера. Я, однако, добавил BufferedStream, но я думаю, что это плохая идея. Спасибо за помощь!Inherited Stream; буферизация в Read()
ответ
Внутренний источник возвращает буферы фиксированного размера? В этом случае это не совсем то, что делает 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);
}
Вот ваш «стартер для 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;
}
Непрошеный, возможно, некоторые ошибки. Его непонятно, имеет ли ваш исходный поток длину точных кратных фиксированного размера. Если нет, то окончательный частичный буфер нуждается в дополнительной дополнительной логике.
Основным принципом является поддержание собственного буфера фиксированного размера и отслеживание положения в этом буфере, которое до сих пор потребляется с помощью считываний