4

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

4

3 回答 3

14

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

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

using (System.IO.StreamWriter file = new System.IO.StreamWriter("D:\\test.txt"))
{
    for (int i = 0; i < 500; i++)
    {
        file.WriteLine(i);
    }
}
于 2013-10-06T12:26:08.450 回答
4

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

如果您确定要保持文件处于打开状态,则可以添加这行代码以确保在写入时可以看到输出:

    file.AutoFlush = true;

默认情况下,文件的 AutoFlush 属性为false。Console确实如此,这就是为什么您可以立即看到 Console.Write/Line() 的输出的原因。这也是控制台输出如此缓慢的原因之一。

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

于 2013-10-06T13:18:33.637 回答
3

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

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

更改代码以将 StreamWriter 放在 using 语句中,一旦退出 using 块,内容将被刷新。

于 2013-10-06T12:29:01.087 回答