streamWriter转义了一些行

时间:2012-04-16 00:47:15

标签: c# .net stream

我正在尝试读取一个大文本文件(14MB),每行输入一个字符串列表,然后从中获取不同的字符串,然后将其写回另一个文本文件,我使用以下代码:

    static void removeDuplicates(string filename)
    {
        //Reading from the file
        Console.WriteLine("Reading from the file....");
        StreamReader sr = new StreamReader(filename);
        List<string> namesList = new List<string>();
        while (!sr.EndOfStream)
        {
            namesList.Add(sr.ReadLine());
        }

        //Getting the distinct list
        namesList=namesList.Distinct().ToList<string>();           


        Console.WriteLine("Writing to the new file");
        //writing back to the file
        StreamWriter sw = new StreamWriter(filename + "_NoDuplicates",false);
        for (int i = 0; i < namesList.Count; i++)
        {               
            sw.Write(namesList[i] + "\r\n");

        }
    }

问题是streamWriter总是在一定数量的行后停止写入,总是停止在同一个地方写作

我确保列表内容正确,并且循环遍历列表中的所有项目,这只是streamWriter问题。

该列表包含Distinct()之前的1048577项和Distinct()之后的880829;

streamWriter在字符串编号880805的中间停止写入,之后不写任何内容,它甚至停在一个单词的中间!

为什么会发生这种情况,我做错了什么?

1 个答案:

答案 0 :(得分:2)

如果您没有收到错误,那么我的猜测是该文件的最后一位仍然是缓冲的。尝试在方法结束时添加对sw.Flush()的调用。

当然,你需要关闭流,无论如何都应该刷新缓冲区。

<强>解释

StreamWriter内部使用缓冲区。每次调用Write()时,数据实际上都会写入内存中的缓冲区。当缓冲区填满时,它会被刷新到磁盘。

您遇到的问题是因为您正在编写的文件的最后几行没有填满缓冲区,因此没有触发器将缓冲区刷新到磁盘。它总是出现在文件中的同一点,因为这是缓冲区大小的最后一个整数倍。通过关闭流,可以将任何剩余数据刷新到磁盘。