流作家的基本理解

Posted

技术标签:

【中文标题】流作家的基本理解【英文标题】:basic understanding of stream writer 【发布时间】:2010-11-11 18:17:49 【问题描述】:

你好,

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

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

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

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

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

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

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

提前致谢。

【问题讨论】:

除非有很多线程试图写入同一个文件,否则不会导致 100% 的 CPU 使用率。 即使它正在加载整个文件,我也不希望 100% 的 CPU 使用率,因为我希望它是 IO-bound 【参考方案1】:

它是否真的加载整个文件,读取其内容

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

然后关闭手柄

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

每半秒一个文件

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

以上是关于流作家的基本理解的主要内容,如果未能解决你的问题,请参考以下文章

天生作家

作家无法解决itext

不会玩游戏的程序员不是好作家,《深入理解Java虚拟机》周志明来了!

Imdb上所有电影名称、演员、导演、作家的列表

走进江苏作家诗人胭脂茉莉|世界读书日

如何获得剧作家的元素集合?