我正在尝试使用文本编写器将文本写入 .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 已被释放。
谢谢
最佳答案
Dispose
调用 Flush
,它将缓冲区中存储的内部字节写入磁盘
如果不关闭或处置文件,您将留下非托管资源并可能锁定文件,更不用说内存泄漏了。而是始终使用 using
语句
using (TextWriter writer = File.CreateText(@"...txt"))
{
writer.Write("Hello World");
}
但是如果你想连续写入文件,你将不得不刷新它
Clears buffers for this stream and causes any buffered data to be written to the file.
TextWriter writer = File.CreateText(@"...txt");
...
writer.Write("Hello World");
...
writer.Flush(); // at this point the bytes are flushed to disk
...
...
writer.Dispose();
简而言之,大多数流都由内部数组(缓冲区)支持,因此您不会颠簸写入。默认大小为 4k,当它达到缓冲区大小时会自动刷新。如果你想看到立即写入,你必须每次都刷新它
最后,一些流具有自动刷新功能,可以为您完成这项工作
Gets or sets a value indicating whether the StreamWriter will flush its buffer to the underlying stream after every call to Write(Char)
当你完成流时总是处理它
关于c# - 何时调用 File.Dispose(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54016413/