2012-04-16 58 views
0

我試圖讀取一個大的文本文件(14MB),每行轉換成一個字符串列表,然後獲取不同的字符串,然後將其寫回到另一個文本文件,我使用以下代碼:streamWriter轉義一些行

static void removeDuplicates(string filename) 
    { 
     //Reading from the file 
     Console.WriteLine("Reading from the file...."); 
     StreamReader sr = new StreamReader(filename); 
     List<string> namesList = new List<string>(); 
     while (!sr.EndOfStream) 
     { 
      namesList.Add(sr.ReadLine()); 
     } 

     //Getting the distinct list 
     namesList=namesList.Distinct().ToList<string>();   


     Console.WriteLine("Writing to the new file"); 
     //writing back to the file 
     StreamWriter sw = new StreamWriter(filename + "_NoDuplicates",false); 
     for (int i = 0; i < namesList.Count; i++) 
     {    
      sw.Write(namesList[i] + "\r\n"); 

     } 
    } 

的問題是StreamWriter的總是停若干行之後寫,總是停止寫在同一個地方

我確信,在列表中的內容是正確的,並且環路經過列表中的所有項目,它只是streamWriter問題。

該列表包含Distinct()之前的1048577個項目和Distinct()之後的880829個項目;

streamWriter停止在字符串數字880805的中間寫入,並且在此之後不寫任何內容,它甚至停止在單詞的中間!

爲什麼會這樣,我做錯了什麼?

+1

你應該關閉你寫的流 – thumbmunkeys 2012-04-16 00:50:19

+0

@pivotnig耶,謝謝,這解決了這個問題......但我想知道爲什麼每次它停在相同的地方?究竟是什麼讓人開心? – SKandeel 2012-04-16 00:54:03

回答

2

如果你沒有收到錯誤,那麼我的猜測是該文件的最後一位仍然被緩衝。嘗試將sw.Flush()的呼叫添加到方法的末尾。

而且,當然,您需要關閉流,無論如何應該刷新緩衝區。

說明

StreamWriter在內部使用的緩衝器。每次調用Write()時,數據實際上都會寫入內存中的緩衝區。當緩衝區填滿時,它將被刷新到磁盤。

您看到的問題是因爲您正在編寫的文件的最後幾行沒有填滿緩衝區,所以沒有將緩衝區刷新到磁盤的觸發器。它始終發生在文件中的相同位置,因爲這是緩衝區大小的最後整數倍。通過關閉流,可以將剩餘數據刷新到磁盤。

+0

解決了這個問題,但你能解釋爲什麼會發生這種情況嗎?爲什麼每次都在同一個地方? – SKandeel 2012-04-16 01:10:45