HI,
我的问题与使用StreamWriter编写数据的基本理解有关。 如果您考虑以下代码:
StreamWriter writer = new StreamWriter(@"C:\TEST.XML");
writer.WriteLine("somestring");
writer.Flush();
writer.Close();
当使用文件名初始化writer对象时,它所拥有的只是指向该文件的指针。
然而,当我们将任何字符串写入writer对象时,它是否实际加载整个文件,读取其内容,将字符串追加到最后然后关闭句柄?
我希望这不是一个愚蠢的问题。 我问这个是因为,我遇到了一个应用程序,它经常每半秒写一个文件,文件大小增加到大约1 GB,并且它仍然继续写入文件。 (记录)
您认为这可能会导致CPU使用率达到100%吗?
如果我的问题不清楚,请告诉我?
提前致谢。
答案 0 :(得分:3)
它实际上是加载整个文件,读取其内容
框架打开文件后,它将执行FileStream.Seek
操作,将文件指针定位到文件末尾。这是操作系统支持的,不需要读取或写入任何文件数据。
然后关闭句柄
致电Close
或Dispose
时,手柄已关闭。两者都是等价的。 (为方便起见,您可以利用C#using
statement创建一个范围,在退出范围时编译器会处理对Dispose
的调用。)
每半秒一次文件
这听起来不足以将机器加载到100%。特别是因为磁盘I / O主要包括在磁盘上等待,而这种等待对CPU使用没有贡献。使用分析器查看应用程序花费时间的位置。或者,您可能尝试的一种简单技术是在调试器下运行,单击暂停,然后检查线程的调用堆栈。当您随机暂停应用程序时,很有可能会占用大量时间的方法。
答案 1 :(得分:0)
您在上面提供的代码将覆盖文件的内容,因此无需预先加载文件。
尽管如此,您可以通过以下方式附加到文件中:
StreamWriter writer = new StreamWriter(@"C:\TEST.XML", true);
true
参数是告诉它附加到文件
而且,在附加到文件之前,它不会将整个文件加载到内存中
这就是使这个被称为“流”的原因,这意味着如果你走一条路,那么你就是单向的。