在流读取器打开或本地复制流时执行操作,关闭流然后执行操作?

时间:2016-06-28 21:25:51

标签: c# streamreader

以下哪种方法更好?我想问一下,最好是在本地复制流,关闭它并执行使用数据需要完成的任何操作吗?或者只是在流打开的情况下执行操作?假设来自流的输入是巨大的。

第一种方法:

public static int calculateSum(string filePath)
{            
    int sum = 0;
    var list = new List<int>();

        using (StreamReader sr = new StreamReader(filePath))
        {
            while (!sr.EndOfStream)
            {
                list.Add(int.Parse(sr.ReadLine()));
            }
        }

    foreach(int item in list)
        sum += item;
    return sum;
}

第二种方法:

public static int calculateSum(string filePath)
{            
    int sum = 0;

        using (StreamReader sr = new StreamReader(filePath))
        {
            while (!sr.EndOfStream)
            {
                sum += int.Parse(sr.ReadLine());
            }
        }

    return sum;
}

2 个答案:

答案 0 :(得分:0)

如果经常修改文件,则读取数据然后使用它。如果不经常访问它,那么你可以一次读取一行文件并分别处理每一行。

答案 1 :(得分:0)

一般来说,如果你可以一次性完成,那么一次性完成。您指出输入很大,因此可能并非所有内容都适合内存。如果是这种情况,那么你的第一个选择是不可能的。

当然,每个经验法则都有例外。但是,您没有指出文件或访问模式(例如,其他想要访问它的进程)有任何特殊之处,这使您无法保持打开时间超过复制数据所需的时间。

我不知道你的例子是真实场景,还是你只是将sum事件用作占位符来进行更复杂的处理。在任何情况下,如果您逐行处理文件,使用File.ReadLines可以省去很多麻烦:

{{1}}

这不会立即将整个文件读入内存。相反,它使用枚举器一次显示一行,并且只读取尽可能多的数据来维持一个相对较小(可能是4千字节)的缓冲区。