簡體   English   中英

System.IO.StreamWriter不會為整個for循環寫入

[英]System.IO.StreamWriter doesn't write for entire for loop

我試圖在C#中為一個文件編寫一長串數字,但它會在列表結尾之前停止。 例如,以下代碼:

  System.IO.StreamWriter file = new System.IO.StreamWriter("D:\\test.txt");

        for (int i = 0; i < 500; i++)
        {
            file.WriteLine(i);
        }

給我留下一個列出數字0到431的文本文件。將500改為1000可以得到0到840.它似乎總是在循環結束之前停止寫入。 將數字輸出到控制台以及文件成功提供控制台中的完整列表,但不是文件。

您需要在退出程序之前關閉編寫器,以確保將所有緩沖的輸出寫入文件。

一個非常方便的方法是使用using語句,它確保StreamWriter在完成循環后關閉:

using (System.IO.StreamWriter file = new System.IO.StreamWriter("D:\\test.txt"))
{
    for (int i = 0; i < 500; i++)
    {
        file.WriteLine(i);
    }
}

您發現StreamWriter使用緩沖區進行輸出,長度為4096字節。 此緩沖區有助於提高效率,減少對操作系統的WriteFile()函數的調用次數。 確保緩沖區內容使其成為文件需要調用Flush()方法或使用Close()或Dispose()關閉流。

如果您確定要保持文件打開,則可以添加以下代碼行以確保在寫入時可以看到輸出:

    file.AutoFlush = true;

對於文件,AutoFlush屬性默認為false 對於控制台來說這是正確的,這就是為什么你可以立即看到Console.Write / Line()的輸出。 也是控制台輸出速度如此之慢的原因之一。

但鑒於您的文件變量是局部變量,您幾乎肯定只想關閉該文件。 使用using語句可確保在包含此代碼的方法返回時進行處理。 忘記這樣做會使文件打開一段時間,至少直到下一次垃圾收集。

StreamWriter是緩沖的,這意味着每次調用write時它都不會寫入文件。

由於您沒有自己關閉StreamWriter,因此您依賴於對象的終結器來刷新緩沖區中的剩余字節。

更改代碼以將StreamWriter放入using語句中,並在退出using塊時立即刷新內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM