我正在尝试读取一个大文本文件(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的中间停止写入,之后不写任何内容,它甚至停在一个单词的中间!
为什么会发生这种情况,我做错了什么?
答案 0 :(得分:2)
如果您没有收到错误,那么我的猜测是该文件的最后一位仍然是缓冲的。尝试在方法结束时添加对sw.Flush()
的调用。
当然,你需要关闭流,无论如何都应该刷新缓冲区。
<强>解释强>
StreamWriter
内部使用缓冲区。每次调用Write()
时,数据实际上都会写入内存中的缓冲区。当缓冲区填满时,它会被刷新到磁盘。
您遇到的问题是因为您正在编写的文件的最后几行没有填满缓冲区,因此没有触发器将缓冲区刷新到磁盘。它总是出现在文件中的同一点,因为这是缓冲区大小的最后一个整数倍。通过关闭流,可以将任何剩余数据刷新到磁盘。