我有方法:

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我无法将文本消息写入机器文件中?

最佳答案

后台正在进行缓存: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.");
}

关于c# - C#使用Stream时使用Statement对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53156845/

10-14 15:35
查看更多