悠悠楠杉
C的StreamReader和StreamWriter如何读写文本?
深入解析C# StreamReader和StreamWriter的核心用法,通过真实场景案例演示如何实现安全高效的文本读写操作,包含编码处理、资源释放等实战技巧。
在C#应用程序开发中,文本文件的读写操作如同数字世界的毛细血管,而StreamReader
和StreamWriter
正是.NET提供的高效读写工具。本文将从实际工程角度出发,揭示这两个类的正确使用方式。
一、基础读写模式
csharp
// 经典写入范例
using (StreamWriter writer = new StreamWriter("demo.txt", append: true))
{
writer.WriteLine("当前时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
writer.WriteLine("--------------------------");
}
// 标准读取方案
using (StreamReader reader = new StreamReader("demo.txt"))
{
while (!reader.EndOfStream)
{
Console.WriteLine(reader.ReadLine());
}
}
注意点:
1. using
语句确保资源释放
2. 构造函数第二个参数控制追加/覆盖模式
3. 默认使用UTF-8编码
二、编码处理实战
中文乱码是常见问题,需要显式指定编码:csharp
// 处理GB2312编码文件
var reader = new StreamReader("legacy.txt", Encoding.GetEncoding("GB2312"));
// 写入带BOM的UTF-8文件
var writer = new StreamWriter("export.csv", false, new UTF8Encoding(true));
三、大文件处理技巧
处理500MB以上的日志文件时,需采用缓冲策略:csharp
const int bufferSize = 1024 * 1024; // 1MB缓冲
char[] buffer = new char[bufferSize];
using (var reader = new StreamReader("huge.log",
Encoding.UTF8, true, bufferSize))
{
int charsRead;
while ((charsRead = reader.Read(buffer, 0, buffer.Length)) > 0)
{
ProcessBuffer(buffer, charsRead);
}
}
四、异常处理规范
完整的文件操作应包含异常处理:
csharp
try
{
using (var sr = new StreamReader("config.json"))
{
string content = sr.ReadToEnd();
// 解析逻辑...
}
}
catch (FileNotFoundException ex)
{
Logger.Error($"配置文件缺失: {ex.Message}");
CreateDefaultConfig();
}
catch (IOException ex)
{
Logger.Error($"IO异常: {ex.Message}");
throw;
}
五、高级应用场景
异步操作:
csharp async Task WriteLogAsync(string message) { using (var writer = new StreamWriter("app.log", true)) { await writer.WriteLineAsync($"[{DateTime.Now}] {message}"); } }
自定义流处理:csharp
MemoryStream memoryStream = new MemoryStream();
using (var writer = new StreamWriter(memoryStream, Encoding.UTF8, 1024, true))
{
writer.Write("内存流测试");
}
// 重置流位置后可重复读取
memoryStream.Position = 0;
性能优化建议:
- 对于频繁写入场景,考虑设置AutoFlush = false
- 读取大文件时优先使用ReadLine
而非ReadToEnd
- 考虑使用BufferedStream
包装基础流