【问题标题】:Is it necessary to create multiple streamreader instances to read multiple files?是否需要创建多个 streamreader 实例来读取多个文件?
【发布时间】:2012-06-25 04:19:28
【问题描述】:

我想使用流式阅读器将多个文件的文本读入一个字符串,但到目前为止,我的代码让我每次想读取不同的文件时都创建一个新的流式阅读器。这行得通,尽管重复数百次后,它似乎效率很低。我确信这是一个非常简单的解决方法,但我还是编程新手,因此非常感谢一些知识。

我想避免的低效代码示例:

someloop
{

    using (StreamReader sR = new StreamReader(changingfilename))
    {
      textString = sR.ReadToEnd();

    }

}

【问题讨论】:

    标签: c# performance file streamreader


    【解决方案1】:

    从磁盘读取比较慢。 StreamReader 的实例化可以忽略不计。缓慢的部分是 ReadToEnd(),而不是新的 StreamReader()。如果您的代码太慢,请尽量避免从磁盘读取。

    Visual Studio 的某些版本附带一个分析器,它会准确地告诉您哪些方法正在花费您程序的 cpu/时钟时间

    【讨论】:

    • 那么如果我理解正确的话,就不可能避免完全读取文件所伴随的延迟时间?
    • 是的。做 IO(disk, network, db) 比 cpu 和 memory 操作慢很多。
    • 除非您多次读取同一个文件。然后,您可以将内容存储在内存中。如果您多次阅读同一个文件,您的问题不清楚。
    • 不,每次都是不同的文件(所以你的原始答案非常适合我)。谢谢!
    • 由于您提到延迟时间,这表明您在某种 ui 中运行它。您可以通过在不同的线程中执行读取来避免在读取时阻塞 gui。与进度条相结合,延迟将被视为更短。
    【解决方案2】:

    你必须为每个文件创建一个 stramreader 你可以做的是 创建一个数组并像这样读取它

    List<string> lstFileNames=new List<string>();
    StringBuilder stringBuffer=new StringBuilder();
    lstFileNames.Add("File1");
    lstFileNames.Add("File2");
    for(int i=0;i<lstFiles.Count;i++)
    {
         using (StreamReader sR = new StreamReader(lstFiles[i]))
        {
            stringBuffer.Append(sR.ReadToEnd());
        }
    }
    

    用于附加字符串的用户字符串生成器。

    【讨论】:

    • 但这会更快吗,考虑到它现在涉及创建额外的变量?
    • 不会的。不是因为额外的变量,而是因为执行了相同数量的读取。
    【解决方案3】:

    更好的方法是让 .NET 为您处理此问题,并使用 File.ReadAllText(yourFileNameAndPath) 静态方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-05
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 2016-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多