在循环内使用 StreamWriter/Reader 的“using”语句

问题描述 投票:0回答:5

这是我的情况。

  1. 从文本文件中读取一行
  2. “处理”线路
  3. 将“已处理”行写入新的文本文件
  4. 循环到#1并重复直到EOF

这是我的做法:

using (StreamReader srReader = new StreamReader(strInputFile))
{
    // loop until EOF
    while ((strCurrentLine = srReader.ReadLine()) != null)
    {
        // "process" strCurrentLine...

        // write the "processed" strCurrentLine to a new text file
        using (StreamWriter sw = new StreamWriter(strFullOutputPathFileName, false))
        {
            // write strCurrentLine to the new file
            sw.WriteLine("stuff...");
        }
     }
}

我的经理告诉我,使用

using
语句(就像我在循环中一样)会极大地影响性能。原因是因为
StreamWriter
实例将在我循环时创建多次。因此,如果我循环 1,000 次,我的
StreamWriter
对象就会有 1,000 个实例,这可能会严重影响性能。

这是真的吗?另外,我上面的方法是实现这一目标的最佳方法吗?

c# using streamreader streamwriter
5个回答
6
投票

我的经理告诉我,像在循环中一样使用 using 语句会极大地影响性能。原因是因为 StreamWriter 实例将被创建与我循环一样多的次数。因此,如果我循环 1,000 次,我的 StreamWriter 对象就会有 1,000 个实例,这可能会严重影响性能。

这是真的吗?

嗯,这是真的,但不是因为您正在创建实例,而是因为您打开和关闭文件 1,000 次。 您可以创建 1,000 个字符串,而对性能几乎没有影响。

另外,我上面的方法是实现此目的的最佳方法吗?

首先,将 writer 创建移到

while
循环之外:

using (StreamReader srReader = new StreamReader(strInputFile))
{
    // write the "processed" strCurrentLine to a new text file
    using (StreamWriter sw = new StreamWriter(strFullOutputPathFileName, false))
    {
        // loop until EOF
        while ((strCurrentLine = srReader.ReadLine()) != null)
        {
            // "process" strCurrentLine...

            // write strCurrentLine to the new file
            sw.WriteLine("stuff...");
        }
     }
}

但是,您也可以将整个文件读入内存,对其进行处理,然后在一次操作中将其写出。 影响将取决于已完成的处理以及出现错误时您是否想要部分结果。


4
投票

将代码更改为:

using (StreamReader srReader = new StreamReader(strInputFile))
{
    using (StreamWriter sw = new StreamWriter(strFullOutputPathFileName, false))
    {
        while ((strCurrentLine = srReader.ReadLine()) != null)
        {
            sw.WriteLine("stuff...");
        }
    }
}

另外,请查看乔恩关于附加的评论。


2
投票

如果您的文件不大,您可以使用 File.ReadAllLines 获取字符串数组中的文件行,然后进行处理。


1
投票

是的,您将通过这种方式创建许多 StreamWriter(但是,同时运行的实例并不多)。解决这个问题的一个简单方法是在进入 while 循环之前创建 StreamWriter。


0
投票

您应该尽可能少地打开和关闭文件。 因此,在 while 循环之前打开它(创建 Streamwriter)。 在循环中使用 sw.WriteLine("stuff...") 循环后调用 sw.Close()。

你的经理是错误的,因为它不会创建 1000 个实例,因为每个实例都会在迭代结束时释放,但你将打开和关闭文件,这会影响性能。

© www.soinside.com 2019 - 2024. All rights reserved.