2014-01-20 147 views
3

我想我可以在問之前試一試,但只是想確定甚至有可能在我浪費任何時間之前。可以同時寫入/讀取同一個數據流嗎?

我試圖消除內存或物理文件緩衝區的需要。我想通過HTTP或者FTP(或者其他任何方式)下載一個文件,並且在流被填充的同時,我想同時開始將該流(通過HTTP,FTP等)上傳到其他地方。

這在.NET中甚至可能嗎?我認爲做「傳統」的唯一方法是首先允許流完成,然後將該流從內存中複製到另一個流中,但我想使用最少量的資源(時間,內存等)作爲可能。

+1

這應該可以正常工作。 – SLaks

+0

「傳統上,我能想到的唯一方法就是首先讓流完成」 - 這根本不正確;它總是有可能(實際上是普通的)讀取一個流的塊並將它們放入第二個流中循環。 –

回答

7

這完全有可能,沒問題;但是你不會使用相同的數據流,你可以使用兩個不同的數據流,並且將數據從輸入傳輸到輸出循環中。

+0

這就是我想要做的,但可能沒有說清楚。我想使用相同的流,所以這是不可能的?您在這裏提出的解決方案似乎是,您必須先等待源碼流完成,然後再複製到其他碼流進行進一步處理。我真正要求的是在同一時間使用相同的流,所以不會有任何延遲。例如,您開始下載到STREAM,並在該瞬間(在完成之前)開始使用該STREAM作爲其他內容。 – SoftwareGuy74

+1

@ user2524616很明顯,你絕對可以做到這一點。你的困惑是關於重用對象。您不*使用單個流對象進行下載和上傳。您將在一個*輸入*流對象上接收數據,然後使用不同的*輸出*流對象上傳它。您將數據從一個數據傳輸到另一個數據。在執行此操作之前,您絕對不需要等待輸入「完成」。 – TypeIA

+0

@ user2524616如果你確實做了很長時間,那麼當你想要上傳它時,你會怎麼做呢?您可以從'FileStream'複製到您的'NetworkStream'中,該文件指向您的上傳位置。只需使用您在那裏使用的代碼,但用指向您的下載的'NetworkStream'替換'FileStream'。 –

1

應該沒問題。最近版本的.Net支持Stream.CopyToAsync(otherStream)(或其non-async counterpart),這幾乎是一個完整的解決方案。

+0

請參閱我對dvnrrs的迴應。我希望在複製到第二個流之前不必等待第一個流完成。另外,我需要使用.NET 4,所以我沒有CopyToAsync。 – SoftwareGuy74

+0

@ user2524616 CopyTo和CopyToAsync不會立即使用輸入流,它們會從輸入中讀取緩衝區的值,然後將其寫入輸出。通常緩衝區是幾個(4左右)千字節。 CopyTo在.Net4中可用,所以如果你可以保持同步,那就使用它。 – spender

+1

由於某種原因,這不適合我。我一直得到0字節的大小。這似乎是我必須首先將輸入流設置爲position = 0,這打破了我所要做的全部目的,因爲我需要等待輸入流填充後。我想在第一個流寫入的同時複製到第二個流。 – SoftwareGuy74

相關問題