2012-11-10 29 views
3

後立即StreamReading文件:StreamWriting考慮到本示例代碼相同的文件

1: using (StreamWriter sw = new StreamWriter(@"C:\file.txt")) 
2: { 
3:  sw.WriteLine(great_string); 
4: } 
5: 
6: using (StreamReader sr = new StreamReader(@"C:\file.txt")) 
7: { 
8:  sr.ReadToEnd(); 
9: } 

是否有可能寫在3號線的great_string不會出現在C:\file.txtStreamReader.ReadToEnd被稱爲第8行?在我看來,這是可能的,因爲你的平均CPU工作速度比你的平均硬盤快得多,但我今天一直在測試,到目前爲止,當我在線閱讀文件時,第3行寫的字符串總是存在的8.我想,也許using聲明不會關閉流,直到所有的數據寫入/讀取文件,從而防止我所問的情況。

我一直在閱讀有關MSDN上的StreamWriter.Close方法,並聲明如下:

必須調用關閉,以確保所有數據被正確地寫入到底層流。

但它沒有說數據將被寫出到底層流。

在此先感謝有關此主題的任何信息。我確實在尋找這個問題的答案,但我沒有找到任何東西......我不知道要搜索什麼條款。

回答

3

的數據可能不是物理上存在於硬盤驅動器調用關閉,但系統(Windows內核)後會給外觀,它是。而所有重要的是外觀。

如果您從剛剛寫入的文件中讀取,則Windows會詢問HDD或從緩存中提供服務。

如果不是這種情況下,這將是很難寫出可靠的程序,因爲效果的順序可以跨職能和流程,甚至隨意改變。這將是混亂。所以系統保證了順序一致性。

如果你仔細想想:如果這個序列化屬性未出示文件可能在同一時間多個內容!第一次閱讀並看到舊內容。再次閱讀,您突然看到更改顯示。幸運的是,這種行爲是不可能的。

+1

「如果不是這種情況,編寫可靠的程序將會很困難,因爲效果的順序可能會隨着功能甚至過程而任意改變,這將是混亂的,因此係統保證了順序的一致性。 ---我在腦海裏想着一個類似的東西,但我不知道怎麼說。謝謝,這非常有幫助。 –

-1

您應該使用Flush代替,它確保數據被寫入。

+1

不!沖洗不適用於此用途。在100%的情況下,完全關閉。刷新導致緩存刷新並導致磁盤搜索。 – usr

+1

@usr:在那裏冷卻你的噴氣機。 'Dispose'調用'Flush',不管你喜不喜歡('Close'只是調用'Dispose(true)')。 –

+1

Dispose不調用Flush。您正在誤讀反射的代碼。它調用刷新FileStream內部緩衝區的FlushWrite。它不建議操作系統物理刷新並導致磁盤「fsync」。中間點:調用Flush是常見的壞建議,我會盡可能採取行動。有些人建議調用Close,Flush,Dispose然後關閉使用塊。這是瘋了。 – usr

2

我在想,也許using語句不會關閉流 ,直到所有的數據被寫入/讀取文件,從而防止 的那種,我想諮詢一下情況。

是的,沒錯。使用()可以確保對象完全處置。有關using語句的更多信息,請參見http://msdn.microsoft.com/en-us/library/yh598w02(v=vs.80).aspx?ppud=4

也就是說,在文件關閉之前,數據將被刷新。它的確會等待文件被寫入。

+0

謝謝!良好的信息。 –

1

alleywayjack的回答是正確的。觀看的定時:

static void Main() 
    { 
     var file = @"c:\temp\test.bin"; 
     String huge = new String(new char[20 * 1024 * 1024]); 
     var sw = new Stopwatch(); 
     var sw2 = new Stopwatch(); 
     sw.Start(); 
     using (var stream = new StreamWriter(file)) 
     { 
      sw2.Start(); 
      stream.Write(huge); 
      sw2.Stop(); 
     } 
     sw.Stop(); 
     sw2.Stop(); 

     Console.WriteLine("Write 20MB to cache: " + (sw.Elapsed.TotalMilliseconds - sw2.Elapsed.TotalMilliseconds)); 
     Console.WriteLine("Write 20MB from cache to HD: " + sw2.Elapsed.TotalMilliseconds); 
    } 

輸出:

Write 20MB to cache: 5 // ms (including preparing the stream) 
Write 20MB from cache to HD: 186 // ms 

整個過程被阻斷(同步)。

+0

感謝您編寫這個。我剛剛運行了這段代碼,其中的差異(如您在輸出中所顯示的)非常大,但並不奇怪。能夠看到差異有多大是很酷的。 –

相關問題