1

我正在尝试使用文本编写器将文本写入 .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 已被释放。

谢谢

4

1 回答 1

5

Dispose调用Flush,它将存储在缓冲区中的内部字节写入磁盘

如果不关闭或释放文件,您将留下非托管资源并可能锁定文件,更不用说内存泄漏了。而是始终使用using语句

using (TextWriter writer = File.CreateText(@"...txt"))
{
   writer.Write("Hello World");
}

但是,如果您想连续写入文件,则必须刷新它

FileStream.Flush 方法

清除此流的缓冲区并导致将任何缓冲数据写入文件。

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) 后是否将其缓冲区刷新到底层流

当您完成流时,请始终将其丢弃

于 2019-01-03T04:38:31.783 回答