2015-10-16 13 views
0

在我的c#程序中,我正在處理一個對象(第三方,所以我無法更改其源代碼)在其構造函數(var myObject = new MyObject(stream);)中。傳遞流(不必保存到中間的內存)

我的挑戰是我需要對文件的某些行進行一些更改,然後才能將其提供給此對象。

要做到這一點,我寫了下面的代碼(沒有工作):

using (var st = new MemoryStream()) 
using (var reader = new StreamReader(path)) 
{ 
    using (var writer = new StreamWriter(st)) 
    { 
     while (!reader.EndOfStream) 
     { 
      var currentLine = reader.ReadLine().Replace(@"XXXX", @"YYYY"); 
      writer.Write(currentLine); 
     } 
     writer.Flush(); 
     st.Position = 0; 
     var myObject = new MyObject(st); 
    } 
} 

所以,這個工作,但它似乎很低效的,因爲它不再是真正的流媒體信息,但其存儲所有內容在將其傳遞給對象之前都在內存流中。

有沒有一種方法來創建一個變換/「直通流」,這將:

  1. 閱讀從StreamReader的每個少量
  2. 做對少量
  3. 流調整該數量通過

那麼中間不會有大量的內存存儲?

謝謝!

回答

1

您只需創建自己的從Stream派生的類,並實現MyObject所需的方法。

通過調用StreamReader上匹配的Read/ReadAsync方法來實現所有Read/ReadAsync方法。隨後可以在數據通過時修改數據。

如果修改需要對數據進行某種理解,您將需要做一些工作,因爲您一次只能處理未知數量的字節。您需要將數據緩衝到做必要轉換所需的程度,但您如何做到這一點非常特定於要實現的流轉換。

不幸的是,C#Stream類的設計被加載了很多行李,所以實現Stream的整個API是相當多的工作,但很可能你的MyObject只在Stream上調用一個或兩個方法,所以有點的實驗應該很快得到它的工作。

+0

謝謝! - 這就是我現在想要做的......我只是希望有一個更好/更簡單的方法....:/ –