0

你好,

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

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

当写入器对象被初始化时,使用文件名,它所拥有的只是一个指向文件的指针。

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

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

您认为这会导致 100% 的 CPU 使用率吗?

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

提前致谢。

4

2 回答 2

3

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

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

然后关闭手柄

Close调用或时句柄关闭Dispose。两者是等价的。(请注意,为方便起见,您可以利用 C#using语句创建一个范围,在该范围内调用Dispose由编译器在退出范围时处理。)

每半秒到一个文件

这听起来不够频繁,无法以 100% 的速度加载机器。尤其是磁盘 I/O 主要是在磁盘上的等待,而这种等待对 CPU 的使用没有贡献。使用分析器查看您的应用程序在哪里花费时间。或者,您可以尝试的一种简单技术是在调试器下运行,单击暂停,然后检查线程的调用堆栈。当您随机暂停应用程序时,一个消耗大量时间的方法很有可能会在堆栈上。

于 2010-11-11T23:53:45.360 回答
0

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

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

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

于 2010-11-11T23:21:39.827 回答