0

我正在尝试读取一个大文本文件(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 的中间停止写入,之后不再写入任何内容,它甚至在一个单词的中间停止!

为什么会这样,我做错了什么?

4

1 回答 1

2

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

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

解释

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

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

于 2012-04-16T00:54:18.317 回答