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

本文关键字:for 循环 IO StreamWriter System | 更新日期: 2023-09-27 18:34:02

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

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

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

一种非常方便的方法是使用 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;

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

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

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

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

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