2011-06-02 93 views
7

爲了工作,我的項目的規範是使用.Net 2.0,所以我沒有得到稍後帶來的方便的CopyTo函數。從一個流複製到另一個流?

我需要將來自HttpWebResponse的響應流複製到另一個流(很可能是MemoryStream,但它可能是Stream的任何子類)。我正常的策略是沿着以下幾點:

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(); 

是否有更有效的方法來做到這一點?緩衝區的大小真的很重要嗎?在.Net 2.0中從一個流複製到另一個流的最佳方式是什麼?

P.S.這是用於下載大型,200 + MB GIS tif圖像。當然,可靠性是最重要的。

+3

可能的[兩個Stream實例之間複製的最佳方法]的副本(http://stackoverflow.com/questions/230128/best-way-to-copy-between-two-stream-instances-c) 。所選擇的答案就是你現在正在做的事情,所以我會說你正確地做了。 – 2011-06-02 15:09:27

+0

在我解決問題之前,我想說我的.NET 2.0限制。我希望這足以保持開放,我不想讓我的問題關閉:( – 2011-06-02 15:20:36

+0

我鏈接到的問題有一個使用您的方法以及更新的'CopyTo'方法的答案。值得一提的是,你會得到更好的性能(如果它符合你的用例)等待整個流進入,然後將流複製到更大的塊中但這並不總是理想的 – 2011-06-02 15:22:44

回答

9

這是一個方便的功能。是的,緩衝區大小很重要。增加它可能會使您在大文件上獲得更好的性能。

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); 
} 
1

可以擺脫BufferedStream的,它如果您正在閱讀的流的一小塊一小塊的唯一有用的。只需獲得一個變量的響應流並使用:

Stream response = HttpResponse.GetResponseStream(); 

緩衝區太小會降低性能。您可以使用更大的緩衝區,以便至少整個IP數據包的數據都適合。我環顧了一下,4096字節就足夠了。您可以真正使用任何大小爲85 kb的文件,之後將其分配到大型對象堆中,在沒有理由的情況下應該避免這樣做。

除此之外,它的效率大致相當。

2

緩衝區的大小確實很重要。例如,如果您一次複製一個字節的兆字節數據,您將在循環中進行2^20次迭代。如果您一次只複製1千字節,則只能在循環中進行2^10次迭代。當你賺取100萬美元時,在撥打ReadWrite時會有很大的開銷。

對於閱讀FileStream,我通常使用介於64K和256K之間的緩衝區。小於32K的任何值都會顯示性能明顯下降,高於256K的值也會如此。使用64K緩衝區和256K緩衝區之間的差異不值得額外的內存。但請注意,這些數字在我的系統和我的網絡上。您的號碼會因硬件和操作系統而異。

對於網絡流,您應該選擇一個緩衝區大小,以跟上傳入的數據流。我建議至少有4千字節,如果因任何原因而導致寫入停頓,它會給你一些緩衝區。

0

我可以想到兩種方法。

  1. 檢查Stream.MemberWiseClone()是否符合您的需要。它爲你提供了一個你的對象的淺拷貝。

  2. 檢查是否有效,如果兩端都是Stream類型。

    BufferedStream bs = new BufferedStream((Stream)memoryStreamObject);

+0

這些方法只會給你另一種訪問同一個流的方式,目的,你可以複製流引用到另一個變量... – Guffa 2011-06-02 15:34:22

相關問題