C#中使用StreamReader处理中文编码及缓冲区刷新
在C#开发中,使用StreamReader读取包含中文的文件时,默认编码可能导致乱码;同时,若未在操作结束时释放StreamWriter的缓冲区,会导致输出文件内容不完整或行数缺失。本文介绍如何通过指定正确的字符编码(如GB2312)以及手动调用Flush()方法来解决这两个常见问题。
结果与问题现象
在使用C#控制台程序或应用程序处理文本文件时,常遇到两个典型错误:
- 中文显示为乱码:由于
StreamReader默认使用ASCII编码,无法正确解析多字节的中文编码格式。 - 输出文件行数不足:即使代码逻辑看似完整,最终生成的文件往往比预期少几十行。这通常是因为
StreamWriter的内部缓冲区未被完全写入磁盘。
准备条件
- 已安装 .NET Framework 或 .NET Core 环境。
- 待处理的源文件(例如包含中英文混合内容的
d:\1500.txt)。 - 目标输出文件路径已规划(例如
d:\English.txt和d:\Chinese.txt)。
真实操作顺序
第1步:正确指定输入流的字符编码
目的:避免读取中文时的乱码问题。
动作:在实例化StreamReader时,显式传入Encoding.GetEncoding("GB2312")参数(或使用UTF8,视源文件实际编码而定)。
StreamReader reader = new StreamReader(@"d:\1500.txt", Encoding.GetEncoding("GB2312"));
第2步:配置输出流及缓冲区大小
目的:定义输出文件路径、覆盖模式及缓冲区大小。
动作:使用StreamWriter创建输出对象,设置编码为UTF-8以兼容通用标准,并适当增大缓冲区(如1024字节)以提升I/O性能。
StreamWriter writerEn = new StreamWriter(@"d:\English.txt", false, Encoding.UTF8, 1024);
StreamWriter writerCh = new StreamWriter(@"d:\Chinese.txt", false, Encoding.UTF8, 1024);
第3步:执行读写逻辑并处理异常
目的:实现文件的交替读写功能,并确保程序稳定性。
入口:循环读取每一行数据。
重要参数:奇偶行判断逻辑。
完成状态:控制台打印成功标记。
try {
int i = 1;
for (String line = reader.ReadLine(); line != null; line = reader.ReadLine()) {
if (i % 2 == 1) {
writerEn.WriteLine(line);
} else {
writerCh.WriteLine(line);
}
i++;
}
Console.WriteLine(i + "\tOK");
} catch (Exception ex) {
Console.WriteLine(ex.ToString());
} finally {
// 关键步骤:确保缓冲区数据写入磁盘
writerEn.Flush();
writerCh.Flush();
}
完成判断与排错
如何判断成功:
1. 打开输出的TXT文件,中文内容显示正常,无问号或方块符号。
2. 检查两输出文件的行数总和是否等于原文件行数(排除空行)。如果之前出现行数缺失,现在应能正常对齐。
常见排错:
如果发现文件仍然行数不全,请确认在using语句块之外是否正确调用了Flush()。此外,确保源文件的实际编码与代码中指定的Encoding一致(GBK/GB2312或UTF-8),否则可能在某些特殊字符处报错。
简要总结
在处理C#文件IO时,指定正确的字符集是解决乱码的前提,而手动刷新缓冲区是保证数据完整性的关键。通过Encoding.GetEncoding("GB2312")和StreamWriter.Flush()的配合,可以有效规避这两类常见陷阱。以上就是C#读取中文字符及清空缓冲区的详细内容,更多关于C#文件处理的技术资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









