关于流的困惑

时间:2012-12-14 10:04:07

标签: c# stream

我正在尝试从SharePoint下载文件。 在做了一些研究之后,我得到了这个,它说如果我们使用缓冲区,性能会更好。

备注 - 文件为SPFile

using (System.IO.Stream strm = file.OpenBinaryStream())
{
    byte[] buffer = new byte[BUFFER_SIZE];
    int bytesRead;
    do
    {
        bytesRead = strm.Read(buffer, 0, BUFFER_SIZE);
        response.OutputStream.Write(buffer, 0, bytesRead);
        response.Flush();
    } while (bytesRead > 0);
} 

一旦我们分配了response.BinaryWrite(file.OpenBinary());,我们是否在strm对象中获取整个流(开始消耗RAM)?假设文件是​​10MB,那么这个strm在RAM中会是10 MB吗?

或者一旦我们开始阅读,它会开始消耗内存吗? bytesRead = strm.Read(buffer, 0, BUFFER_SIZE);

1 个答案:

答案 0 :(得分:3)

Stream是管道,而不是桶;它不(通常)“包含”数据 - 它只管理访问数据。就示例而言,您的应用随时加载的数据为BUFFER_SIZE字节(加上任何其他图层使用的任何其他缓冲区)。

每次写作时你也不需要Flush()(尽管最后的Flush()可能是合适的。)

你拥有的一切都很好;我唯一要说的是你可以在最新版本的.NET中简化这个:

using (System.IO.Stream strm = file.OpenBinaryStream())
{
    strm.CopyTo(response);
    // response.Flush(); // optional: only included because it is in the question
}