C#中使用StreamReader处理中文编码及缓冲区刷新

叶初
叶初
发布时间:2026-10-15 | 3人浏览过
原创

在C#开发中,使用StreamReader读取包含中文的文件时,默认编码可能导致乱码;同时,若未在操作结束时释放StreamWriter的缓冲区,会导致输出文件内容不完整或行数缺失。本文介绍如何通过指定正确的字符编码(如GB2312)以及手动调用Flush()方法来解决这两个常见问题。

结果与问题现象

在使用C#控制台程序或应用程序处理文本文件时,常遇到两个典型错误:

  1. 中文显示为乱码:由于StreamReader默认使用ASCII编码,无法正确解析多字节的中文编码格式。
  2. 输出文件行数不足:即使代码逻辑看似完整,最终生成的文件往往比预期少几十行。这通常是因为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#文件处理的技术资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表