我继承了 Stream 类,其中我不知道如何正确实现 Read() 函数,所以我最终不会有很多嵌套的 if 和难以调试的代码。关键是从该流的源读取返回恒定大小的缓冲区(例如不可更改),但 Read() 函数接受不同的缓冲区大小。我虽然想添加 BufferedStream,但我认为这是个坏主意。感谢帮助!
mnn
问问题
1425 次
2 回答
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);
}
于 2009-02-23T22:49:11.177 回答
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;
}
未经测试,所以可能有一些错误。不清楚您的源流的长度是否是其固定大小的精确倍数。如果不是,那么最终的部分缓冲区需要一些额外的逻辑。
基本原则是保持您自己的固定大小的缓冲区,并跟踪该缓冲区中到目前为止被读取消耗的位置
于 2009-02-23T22:50:15.603 回答