繁体   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