System.IO.StreamWriter不会为整个for循环写入

时间:2013-10-06 12:24:45

标签: c# for-loop streamwriter

我正在尝试将一长串数字写入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.它似乎总是在循环结束之前停止写入。将数字输出到控制台以及文件成功提供控制台中的完整列表,但不是文件。

3 个答案:

答案 0 :(得分:12)

您需要在退出程序之前关闭编写器,以确保将所有缓冲的输出写入文件。

一种非常方便的方法是使用using语句,确保在完成循环后StreamWriter关闭:

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

答案 1 :(得分:4)

您发现StreamWriter使用缓冲区进行输出,长度为4096字节。此缓冲区有助于提高效率,减少对操作系统的WriteFile()函数的调用次数。确保缓冲区内容使其成为文件需要调用Flush()方法或使用Close()或Dispose()关闭流。

如果您确定要保持文件打开,那么您可以添加以下代码行,以确保在写入时可以看到输出:

    file.AutoFlush = true;

对于文件,AutoFlush属性默认为 false 。控制台是 true ,这就是为什么你可以立即看到Console.Write / Line()的输出。也是控制台输出速度如此之慢的原因之一。

但鉴于您的文件变量是一个局部变量,您几乎肯定只想关闭该文件。使用 using 语句确保在包含此代码的方法返回时进行处理。忘记这样做会使文件打开一段时间,至少直到下一次垃圾收集。

答案 2 :(得分:2)

StreamWriter是缓冲的,这意味着每次调用write时它都不会写入文件。

由于您没有自己关闭StreamWriter,因此您依靠对象的终结器来刷新缓冲区中的剩余字节。

更改代码以将StreamWriter放入using语句中,并在退出using块时立即刷新内容。