我有方法:
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我不能将文本消息写入机器的文件中?
答案 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.");
}