悠悠楠杉
C中使用StreamReader和StreamWriter操作文本文件
在现代软件开发中,文件读写是一项基础而关键的操作。无论是日志记录、配置保存,还是数据导入导出,都离不开对文本文件的处理。C#作为一门功能强大的编程语言,提供了丰富的IO类库来支持这些需求,其中StreamReader和StreamWriter是处理文本文件最常用且高效的核心类。
StreamReader和StreamWriter位于System.IO命名空间下,专为字符流的读取与写入设计。与底层的FileStream不同,它们以字符串为单位进行操作,更适合处理文本内容。使用这两个类可以避免手动处理字节编码的问题,让代码更加简洁清晰。
要读取一个文本文件,首先需要创建一个StreamReader实例。最常见的做法是通过using语句来确保资源的正确释放。例如:
csharp
using (var reader = new StreamReader("example.txt"))
{
string line;
while ((line = reader.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
上述代码逐行读取文件内容并输出到控制台。ReadLine()方法每次返回一行文本,直到文件末尾返回null。这种方式内存占用小,适合处理大文件。如果文件较小,也可以直接调用ReadToEnd()一次性读取全部内容。
写入操作则由StreamWriter完成。它允许我们将字符串写入文件,支持覆盖写入或追加模式。默认情况下,StreamWriter会覆盖原有文件内容:
csharp
using (var writer = new StreamWriter("output.txt"))
{
writer.WriteLine("这是第一行");
writer.WriteLine("这是第二行");
}
若希望在已有文件末尾追加内容,可在构造函数中传入true作为第二个参数:
csharp
using (var writer = new StreamWriter("log.txt", true))
{
writer.WriteLine($"[{DateTime.Now}] 系统启动");
}
这种模式常用于日志记录场景,确保每次运行程序都能保留历史信息。
值得注意的是,using语句在这里至关重要。它保证了即使发生异常,Dispose()方法也会被调用,从而正确关闭文件流,防止资源泄漏或文件被长时间锁定。如果不使用using,必须手动调用Close()或Dispose(),否则可能导致后续操作失败。
编码问题也是文本处理中不可忽视的一环。默认情况下,StreamReader和StreamWriter使用UTF-8编码。如果文件采用其他编码(如GB2312),需要显式指定:
csharp
var encoding = Encoding.GetEncoding("GB2312");
using (var reader = new StreamReader("chinese.txt", encoding))
{
// 读取中文文本
}
此外,C#还提供了更高级的静态方法简化常见操作。例如File.ReadAllText()、File.WriteAllText()、File.ReadLines()等,适用于简单场景。但当需要精细控制读写过程、处理大文件或实现特定逻辑时,StreamReader和StreamWriter仍是首选。
在实际项目中,建议结合异常处理机制增强健壮性。文件可能因权限不足、路径无效或磁盘满等原因无法访问。通过try-catch捕获IOException、UnauthorizedAccessException等异常,可以提供友好的错误提示或降级处理策略。
