C# 从一个流复制到另一个流?

C# 从一个流复制到另一个流?,c#,.net-2.0,C#,.net 2.0,对于工作,我的项目的规范是使用.NET2.0,因此我无法获得以后带来的方便的CopyTo功能 我需要将响应流从HttpWebResponse复制到另一个流(很可能是MemoryStream,但它可以是流的任何子类)。我通常的策略是: BufferedStream bufferedresponse = new BufferedStream(HttpResponse.GetResponseStream()); int count = 0; byte[] buffer = new byte[1024]

对于工作,我的项目的规范是使用.NET2.0,因此我无法获得以后带来的方便的
CopyTo
功能

我需要将响应流从
HttpWebResponse
复制到另一个流(很可能是
MemoryStream
,但它可以是
流的任何子类)。我通常的策略是:

BufferedStream bufferedresponse = new BufferedStream(HttpResponse.GetResponseStream());
int count = 0;
byte[] buffer = new byte[1024];
do {
    count = bufferedresponse.Read(buffer, 0, buffer.Length);
    target.Write(buffer, 0, count);
} while (count > 0);
bufferedresponse.Close();
有没有更有效的方法?缓冲区的大小真的很重要吗?在.NET2.0中,从一个流复制到另一个流的最佳方式是什么


另外,这是用于下载200 MB以上的大型GIS tif图像。当然,可靠性是最重要的。

这是一个方便的功能。是的,缓冲区大小很重要。增加它可能会使您在处理大型文件时获得更好的性能

public static void WriteTo(Stream sourceStream, Stream targetStream)
{
       byte[] buffer = new byte[0x10000];
       int n;
       while ((n = sourceStream.Read(buffer, 0, buffer.Length)) != 0)
           targetStream.Write(buffer, 0, n);
}

您可以去掉
BufferedStream
,它只有在读取流的小块时才有用。只需在变量中获取响应流,然后使用:

Stream response = HttpResponse.GetResponseStream();
缓冲区太小会降低性能。您可以使用更大的缓冲区,这样至少可以容纳整个IP数据包中的数据。我四处看了看,4096字节应该足够了。实际上,您可以使用最大为85 kb的任何大小,然后将其分配到大型对象堆中,如果没有理由,您应该避免这样做


除此之外,它的效率几乎和它得到的一样。

缓冲区的大小确实很重要。例如,如果您一次复制一个兆字节的数据,那么您将在循环中进行2^20次迭代。如果一次复制1 KB,则在循环中只能进行2^10次迭代。当您要进行一百万次调用时,对
读取
写入
的调用会产生很大的开销

对于读取
FileStream
,我通常使用介于64K和256K之间的缓冲区。任何低于32K的数据都会显示性能显著下降,高于256K的数据也是如此。使用64K缓冲区和256K缓冲区之间的差异不值得额外的内存。不过,请注意,这些数字都在我的系统和网络中。您的数字将因硬件和操作系统而异


对于网络流,您应该选择与传入数据流保持一致的缓冲区大小。我建议至少4千字节,如果写入因任何原因暂停,这将为您提供一些缓冲。

我可以想出两种方法

  • 检查Stream.MemberWiseClone()是否符合您的需要。它会给你一个对象的浅拷贝

  • 检查这是否有效,如果两端都是流类型

    BufferedStream bs=新的BufferedStream((流)memoryStreamObject)


  • 可能的副本。此外,选择的答案是您当前正在做的事情,因此我认为您做得正确。在我结束我的问题之前,我想说我的问题带有.Net 2.0限制。我希望这足以让它保持开放,我不希望我的问题关闭:(我链接到的问题有一个答案,使用您的方法以及更新的
    CopyTo
    方法。值得一提的是,您将获得更好的性能(如果它适合您的用例)等待整个流进入,然后将流复制到更大的块中。但这并不总是理想的。这些方法将为您提供另一种访问同一流的方式,为此,您可以将流引用复制到另一个变量。。。