使用"使用" StreamWriter / Reader内部循环语句

时间:2014-03-27 20:06:30

标签: c# using streamreader streamwriter

这是我的情况。

  1. 从文本文件中读取一行
  2. "处理"这条线
  3. 写下"已处理的"换行到新的文本文件
  4. 循环至#1并重复直至EOF
  5. 以下是我的工作方式:

    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实例的创建次数与我循环次数相同。所以,如果我循环了1000次,我的StreamWriter对象有1000个实例,这可能严重阻碍性能。

    这是真的吗?另外,我的方法是否是实现此目标的最佳方法?

5 个答案:

答案 0 :(得分:6)

  

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

     

这是真的吗?

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

  

另外,我的方法是否是实现此目标的最佳方法?

首先,将作者创建移到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...");
        }
     }
}

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

答案 1 :(得分:4)

将您的代码更改为:

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

另外,请查看Jon关于追加的评论。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

您应该尽可能少地打开和关闭文件。 所以在while循环之前打开它(创建streamwriter)。 在循环中使用sw.WriteLine(“stuff ...”) 循环后调用sw.Close()。

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

此致 戴姆詹·