对流作者的基本了解

时间:2010-11-11 18:17:50

标签: c# performance logging filesize streamwriter

HI,

我的问题与使用StreamWriter编写数据的基本理解有关。 如果您考虑以下代码:

            StreamWriter writer = new StreamWriter(@"C:\TEST.XML");
            writer.WriteLine("somestring");
            writer.Flush();
            writer.Close();

当使用文件名初始化writer对象时,它所拥有的只是指向该文件的指针。

然而,当我们将任何字符串写入writer对象时,它是否实际加载整个文件,读取其内容,将字符串追加到最后然后关闭句柄?

我希望这不是一个愚蠢的问题。 我问这个是因为,我遇到了一个应用程序,它经常每半秒写一个文件,文件大小增加到大约1 GB,并且它仍然继续写入文件。 (记录)

您认为这可能会导致CPU使用率达到100%吗?

如果我的问题不清楚,请告诉我?

提前致谢。

2 个答案:

答案 0 :(得分:3)

  

它实际上是加载整个文件,读取其内容

框架打开文件后,它将执行FileStream.Seek操作,将文件指针定位到文件末尾。这是操作系统支持的,不需要读取或写入任何文件数据。

  

然后关闭句柄

致电CloseDispose时,手柄已关闭。两者都是等价的。 (为方便起见,您可以利用C#using statement创建一个范围,在退出范围时编译器会处理对Dispose的调用。)

  

每半秒一次文件

这听起来不足以将机器加载到100%。特别是因为磁盘I / O主要包括在磁盘上等待,而这种等待对CPU使用没有贡献。使用分析器查看应用程序花费时间的位置。或者,您可能尝试的一种简单技术是在调试器下运行,单击暂停,然后检查线程的调用堆栈。当您随机暂停应用程序时,很有可能会占用大量时间的方法。

答案 1 :(得分:0)

您在上面提供的代码将覆盖文件的内容,因此无需预先加载文件。
尽管如此,您可以通过以下方式附加到文件中:

StreamWriter writer = new StreamWriter(@"C:\TEST.XML", true);

true参数是告诉它附加到文件 而且,在附加到文件之前,它不会将整个文件加载到内存中 这就是使这个被称为“流”的原因,这意味着如果你走一条路,那么你就是单向的。