c# - 继承流;在 Read() 中缓冲

标签 c# stream buffer

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

最佳答案

内部源返回固定大小的缓冲区?如果是那样的话,这并不是 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);
}

关于c# - 继承流;在 Read() 中缓冲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/579593/

相关文章:

c# - 用小写字母进行 Python URL 编码?

c# - 需要调用从 View 返回字符串值的 Controller 方法

c++ - 在堆上分配内存的函数原型(prototype) (C/C++)

C++将.txt文件中的字符串输出到成员方法本地范围之外的动态数组

javascript - NodeJS 流和请求模块

SSIS 2019 AutoAdjustBufferSize 导致缓冲区分配错误

c - 如何从缓冲区中删除空格

c# - 当数字是整数而不是小数或 double 时,为什么 WriteLine 会跳过 Tab

C# .NET x86/x64 哪个项目决定平台?

java - 从底层 InputStream 解析时,Jackson 如何处理流结束读取(例如 -1、EOF)