在C#开发中,处理文本文件是一项非常常见的任务,其中按行读取文件内容是最基础也最常用的操作。无论是读取配置文件、日志文件还是普通文本数据,逐行读取都能让处理逻辑更清晰。C#提供了多种实现逐行读取文本文件的方式,不同方式适用于不同的场景,下面逐一介绍。

C#逐行读取文件的常用方法
方法一:使用File.ReadAllLines方法
File类是C#中处理文件的基础类,ReadAllLines方法可以直接将文本文件的所有内容按行读取到一个字符串数组中,使用非常简单。
该方法的优点是代码简洁,一行代码就能完成读取操作,适合处理小文件,因为会一次性将文件所有内容加载到内存中。如果文件过大,可能会导致内存占用过高。
using System;
using System.IO;
class Program
{
static void Main()
{
string filePath = "test.txt";
try
{
// 按行读取文件内容到字符串数组
string[] lines = File.ReadAllLines(filePath);
// 遍历每一行内容
foreach (string line in lines)
{
Console.WriteLine(line);
}
}
catch (Exception ex)
{
Console.WriteLine("读取文件出错:" + ex.Message);
}
}
}
如果需要指定文件编码,可以使用带编码参数的重载方法,比如读取UTF-8编码的文件:
// 指定编码为UTF-8读取文件 string[] lines = File.ReadAllLines(filePath, Encoding.UTF8);
方法二:使用File.ReadLines方法
File.ReadLines方法和ReadAllLines类似,也是按行读取文件,但不同的是它返回的是IEnumerable<string>类型,采用延迟加载的方式,不会一次性将所有内容加载到内存中,适合处理大文件。
using System;
using System.IO;
using System.Text;
class Program
{
static void Main()
{
string filePath = "large_file.txt";
try
{
// 延迟加载逐行读取,不会一次性占用大量内存
foreach (string line in File.ReadLines(filePath, Encoding.UTF8))
{
Console.WriteLine(line);
}
}
catch (Exception ex)
{
Console.WriteLine("读取文件出错:" + ex.Message);
}
}
}
方法三:使用StreamReader类
StreamReader是更底层的文件读取类,提供了更灵活的控制能力,通过ReadLine方法可以逐行读取文件,读取到文件末尾时返回null。
这种方式的优势是可以手动控制读取过程,还可以在读取完成后释放资源,同样适合大文件场景。
using System;
using System.IO;
using System.Text;
class Program
{
static void Main()
{
string filePath = "test.txt";
// 使用using语句自动释放StreamReader资源
using (StreamReader reader = new StreamReader(filePath, Encoding.UTF8))
{
string line;
// 循环读取每一行,直到读取到null表示文件结束
while ((line = reader.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
catch (Exception ex)
{
Console.WriteLine("读取文件出错:" + ex.Message);
}
}
}
不同方法的对比与选择
为了更清晰地选择合适的读取方法,下面从内存占用、适用场景、灵活性三个维度对比三种方法:
| 方法 | 内存占用 | 适用场景 | 灵活性 |
|---|---|---|---|
| File.ReadAllLines | 高(一次性加载全部内容) | 小文件,需要快速获取所有行数据 | 低 |
| File.ReadLines | 低(延迟加载) | 大文件,仅需遍历处理行数据 | 中 |
| StreamReader.ReadLine | 低(逐行读取) | 大文件,需要自定义读取逻辑 | 高 |
注意事项
- 读取文件时要做好异常处理,常见的异常包括文件不存在、没有访问权限、编码不匹配等,使用try-catch块捕获异常可以避免程序崩溃。
- 如果文件编码不是默认的UTF-8,一定要手动指定正确的编码,否则会出现乱码问题。
- 使用StreamReader时,如果没有使用using语句,一定要手动调用Dispose方法释放资源,避免文件句柄泄漏。
- 处理大文件时,优先选择ReadLines或者StreamReader方式,避免使用ReadAllLines导致内存溢出。
常见问题解答
读取文件时出现乱码怎么办
乱码通常是编码不匹配导致的,需要确认文本文件的实际编码,然后在读取时传入对应的编码参数,比如GB2312编码需要传入Encoding.GetEncoding("GB2312")。
如何跳过空行读取
可以在遍历行的时候判断行内容是否为空或者空白字符,示例代码如下:
using System;
using System.IO;
using System.Text;
class Program
{
static void Main()
{
string filePath = "test.txt";
using (StreamReader reader = new StreamReader(filePath, Encoding.UTF8))
{
string line;
while ((line = reader.ReadLine()) != null)
{
// 跳过空行和仅包含空白字符的行
if (!string.IsNullOrWhiteSpace(line))
{
Console.WriteLine(line);
}
}
}
}
}
C#逐行读取文件文本文件File_ReadAllLinesStreamReader修改时间:2026-07-01 05:54:30