C#使用Stream时使用Statement对象

时间:2018-11-05 14:56:39

标签: c#

我有方法:

public static void Main()
{
    string path = @"C:\Temp\ProgrammingInCSharp\DirectoryInfo\111.txt";
    using (FileStream fileStream = File.Create(path))
    {
        using (BufferedStream bufferedStream = new BufferedStream(fileStream))
        {
            using (StreamWriter streamWriter = new StreamWriter(bufferedStream))
            {
                streamWriter.WriteLine("A line of text.");
            }
        }
    }
}

正在使用3个using语句,并且方法运行完美:创建111.txt并输入“一行文本”。在里面。 但是当我将方法更改为:

public static void Main()
{
    string path = @"C:\Temp\ProgrammingInCSharp\DirectoryInfo\111.txt";
    FileStream fileStream = File.Create(path);
    BufferedStream bufferedStream = new BufferedStream(fileStream);
    StreamWriter streamWriter = new StreamWriter(bufferedStream);
    streamWriter.WriteLine("A line of text.");
}

它仅创建111.txt文件,但不写“一行文本”。内。

我不明白为什么。

当我阅读使用Statement时,只要对象离开了使用Statement的范围,就只需调用Dispose()方法。因此,应该使用它来处理来自CLR的非托管代码,但是为什么不使用Statement我不能将文本消息写入机器的文件中?

1 个答案:

答案 0 :(得分:4)

后台正在进行缓存:WriteLine写入缓存,而不是直接写入文件。因此,如果未正确关闭文件,则缓存实际上不会写入磁盘。 using语句处理该对象,该对象将缓存刷新到文件中并关闭文件。

您可以在此处查看StreamWriter.Dispose()的源代码(注意它调用了Flush()):https://referencesource.microsoft.com/#mscorlib/system/io/streamwriter.cs,236

请注意,使用多个using语句,您只需要一个代码块。效果是一样的,但是更容易阅读。

using (FileStream fileStream = File.Create(path))
using (BufferedStream bufferedStream = new BufferedStream(fileStream))
using (StreamWriter streamWriter = new StreamWriter(bufferedStream))
{
    streamWriter.WriteLine("A line of text.");
}