.NET Streams是否可以节省内存?

时间:2009-02-26 19:03:18

标签: .net memory stream

示例:

  1. 如果我通过.NET Streams读取文件并将其复制到另一个文件,那么文件的总大小会随时占用内存吗?或者这些字节一旦被使用就会被丢弃?
  2. 如果天真的方法不能节省内存会缓冲Streams吗?

4 个答案:

答案 0 :(得分:13)

如果您流式传输复制,即读取缓冲区,写入缓冲区,读取缓冲区,写入缓冲区等,直到数据用完为止,它将只占用缓冲区大小的内存。我希望File.Copy能够做到这一点(在本机Windows代码中,无可否认)。

如果您想自己动手,请使用以下内容:

public void CopyData(Stream input, Stream output)
{
    byte[] buffer = new byte[32 * 1024];
    int read;
    while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
    {
        output.Write(buffer, 0, read);
    }
}

这只需要32K,但是流量很大。

编辑:正如评论中所指出的那样,流也可能有自己的缓冲区,但关键是你仍然可以传输一个非常大的文件而不会耗尽内存。

答案 1 :(得分:3)

如果你调用ReadToEnd()之类的东西然后是,那么文件的内容将被加载到内存中。猜测使用缓冲区是确保在任何给定时间只将文件数据的一部分加载到内存中的正确方法,这是正确的。

答案 2 :(得分:2)

不,整个文件不会被加载到内存中。

内存占用量取决于用于读写的缓冲区大小,以及流维护的任何内部缓冲区。

FileStream类使用内部缓冲区,其大小可以在构造函数重载中指定,默认为0x1000字节(可能依赖于实现 - 此值是通过使用Lutz Reflector检查FileStream类获得的。)

答案 3 :(得分:1)

这实际上取决于您的方法。如果您将流用作ReadToEnd()的临时端点,则可以将整个文件加载到内存中。相反,如果您正在缓冲,则不会在缓冲区大小上使用超过一点的开销。