我正在尝试使用文本编写器将文本写入.NET Core中的文件。以下代码不会向文件输出任何内容:
TextWriter writer = File.CreateText(@"...txt");
writer.Write("Hello World");
但是,这样做:
TextWriter writer = File.CreateText(@"...txt");
writer.Write("Hello World");
writer.Dispose();
那是为什么?那多余的行告诉程序如何做不同的事情?我不想关闭TextWriter,因为它将要编写日志,这些日志在我的应用程序运行时会持续不断地运行。
如何在应用程序停止运行之前将其保持打开状态?
更新
所以我要这样做的原因是,我正在使用将其日志写入TextWriter的SDK:
TextWriterLogger(textWriter);
//Creates a logger that writes to a TextWriter. User is responsible for providing an instance of TextWriter that is thread safe.
但是,如果我仅将其包含在using语句中,则不会写入日志,因为在准备好编写日志时,using语句将已执行,并且TextWriter会被处理。
谢谢
答案 0 :(得分:5)
Dispose
调用Flush
,它将存储在缓冲区中的内部字节写入磁盘
如果不关闭或处理文件,则会留下不受管理的资源,并且可能会锁定文件,更不用说内存泄漏了。而是始终使用using
语句
using (TextWriter writer = File.CreateText(@"...txt"))
{
writer.Write("Hello World");
}
但是,如果要连续写入文件,则必须将其刷新
清除此流的缓冲区,并使所有缓冲的数据 写入文件。
TextWriter writer = File.CreateText(@"...txt");
...
writer.Write("Hello World");
...
writer.Flush(); // at this point the bytes are flushed to disk
...
...
writer.Dispose();
简而言之,大多数流都由内部数组(缓冲区)支持,因此您不必担心写入。默认大小为4k,当达到缓冲区大小时,它将自动刷新。如果您想立即看到写入内容,则必须每次
最后一些流具有自动刷新功能,可以为您完成这项工作
获取或设置一个值,该值指示StreamWriter是否将刷新 每次调用Write(Char)
后,将其缓冲区缓冲到基础流
当您完成流处理后始终处理