2014-11-13 98 views
0

我有一個問題重構了一段代碼。我隱約明白這個問題,但多一點洞察力或解釋會對我的理解和解決問題很有幫助。MemoryStream不能擴展...從FileStream重構到MemoryStream或類似

首先的原代碼塊:

FileStream fS = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite); 
Int64 fSLength = fS.Length; 
Int64 remainingNotFulEncDecBlock = fSLength % 1; 
fS.Seek(0, SeekOrigin.End); 
Int64 nrBytesToAdd = 1 - remainingNotFulEncDecBlock; 

Byte fillByte = (Byte)'$'; 

    for (Int32 i = 0; i < nrBytesToAdd - 1; i++) 
    fS.WriteByte(fillByte); 
    fS.WriteByte((Byte)nrBytesToAdd); 
    fSLength = fS.Length; 
    fS.Close(); 

的唯一宗旨,以重構的是,我們不再有一個物理文件打開。相反,我們提供了一個byte[]

這裏是我的重構的代碼:

MemoryStream fS = new MemoryStream(_data); 
Int64 fSLength = fS.Length; 
Int64 remainingNotFulEncDecBlock = fSLength % 1; 
fS.Seek(0, SeekOrigin.End); 
Int64 nrBytesToAdd = 1 - remainingNotFulEncDecBlock; 

Byte fillByte = (Byte)'$'; 
    for (Int32 i = 0; i < nrBytesToAdd - 1; i++) 
    fS.WriteByte(fillByte); 
    fS.WriteByte((Byte)nrBytesToAdd); 
    fSLength = fS.Length; 
    fS.Close(); 

上面的代碼產生錯誤MemoryStream不能上線

fS.WriteByte((Byte)nrBytesToAdd); 

本來我不得不穀歌的錯誤,並宣讀了擴展。現在這是有意義的,因爲內存流已被設置爲特定大小。我不清楚的是我應該如何繼續。我創建未設置爲特定的大小從而讓我這樣做的另一個MemoryStream對象:

MemoryStream ms = new MemoryStream(); 
ms.WriteByte((Byte)nrBytesToAdd); 

我的這種技術讀數表明,這將是少高性能比初始化MemoryStream到然而指定byte[]我不知道(無法找到)動態擴展MemoryStream的另一種方法。另外一個好處就是現在和將來的byte[]都會非常小,所以儘管速度較慢可能不會對性能產生巨大影響。

+1

只要你沒有用特定的'byte []'緩衝區初始化'MemoryStream'就可以調整它的大小(即,除了你在這裏使用它以外的其他方式)。但是你發佈的代碼意義不大,很難知道正確的答案是什麼。 'fsLength%1'總是返回0,所以爲什麼要麻煩?考慮到這一點,你的循環如何做任何事情,因爲'nrBytesToAdd'總是1,所以'i

回答

1

您可以使用具有初始容量的MemeoryStream constructor

MemoryStream fS = new MemoryStream(_data.Length); 

這將設置該大小的內部字節數組,使得內存流不必在每次達到其大小限制時都繼續擴展數組。它將允許您將字節添加到內存流中。雖然沒有靜態字節[]大小那樣有效,但它可能是下一個最好的事情。