C#에서 텍스트 파일을 한 줄씩 읽는 방법은 여러 가지가 있습니다. 대표적으로 StreamReader.ReadLine, File.ReadLines, File.ReadAllLines 등이 있으며, 각각의 동작 방식과 장단점이 다릅니다.
이 글에서는 아래와 같은 내용이 담긴 로컬 텍스트 파일(Demo.txt)을 예시로 세 가지 방법을 하나씩 살펴보겠습니다.

1. StreamReader.ReadLine 사용하기
StreamReader는 지정된 인코딩 방식으로 스트림에서 문자를 읽어오는 클래스입니다. ReadLine 메서드는 입력 스트림에서 한 줄씩 문자열을 읽어 들이며, StreamReader는 TextReader를 상속하기 때문에 문자 단위, 블록 단위, 라인 단위, 전체 내용 읽기 등 다양한 방식의 읽기를 지원합니다.
파일을 열고 스트림 리더를 생성한 뒤, while 루프로 파일 끝(null)에 도달할 때까지 한 줄씩 처리하는 방식입니다. using 문을 사용하면 작업이 끝난 후 리소스가 자동으로 해제되므로 안전합니다.
예제 코드
using System;
using System.IO;
using System.Text;
namespace DemoApplication{
public class Program{
static void Main(string[] args){
using (var fileStream = File.OpenRead(@"D:\Demo\Demo.txt"))
using (var streamReader = new StreamReader(fileStream, Encoding.UTF8)){
String line;
while ((line = streamReader.ReadLine()) != null){
Console.WriteLine(line);
}
}
Console.ReadLine();
}
}
}실행 결과
Hi All!! Hello Everyone!! How are you?
2. File.ReadLines 사용하기
File.ReadLines() 메서드는 텍스트 파일을 열어 모든 줄을 IEnumerable<string> 형태로 반환한 후 파일을 닫습니다. 지연 실행(lazy evaluation) 방식으로 동작하기 때문에 파일 전체를 메모리에 한 번에 올리지 않고, 반복문이 진행되면서 한 줄씩 읽어 옵니다. 따라서 용량이 큰 파일을 처리할 때도 메모리 사용량이 적어 효율적입니다.
예제 코드
using System;
using System.IO;
namespace DemoApplication{
public class Program{
static void Main(string[] args){
var lines = File.ReadLines(@"D:\Demo\Demo.txt");
foreach (var line in lines){
Console.WriteLine(line);
}
Console.ReadLine();
}
}
}실행 결과
Hi All!! Hello Everyone!! How are you?
3. File.ReadAllLines 사용하기
File.ReadAllLines()는 ReadLines와 비슷하지만, 반환 타입이 IEnumerable<string>이 아닌 string[] 배열이라는 점이 다릅니다. 배열로 반환되기 때문에 인덱스를 이용해 특정 줄에 바로 접근하는 등 임의 접근(random access)이 가능하다는 장점이 있습니다. 다만 파일의 모든 내용을 먼저 메모리에 적재한 후 처리하기 때문에, 매우 큰 파일에는 적합하지 않습니다.
예제 코드
using System;
using System.IO;
namespace DemoApplication{
public class Program{
static void Main(string[] args){
var lines = File.ReadAllLines(@"D:\Demo\Demo.txt");
for (var i = 0; i < lines.Length; i += 1){
var line = lines[i];
Console.WriteLine(line);
}
Console.ReadLine();
}
}
}실행 결과
Hi All!! Hello Everyone!! How are you?
정리: 어떤 방법을 선택해야 할까?
세 가지 방법 모두 동일한 출력 결과를 보여주지만, 상황에 따라 최적의 선택이 달라집니다.
- 대용량 파일을 순차적으로 처리할 때: File.ReadLines 또는 StreamReader.ReadLine이 유리합니다. 메모리에 한 줄씩만 유지되므로 성능과 메모리 효율이 좋습니다.
- 파일 크기가 작거나 특정 줄에 임의 접근이 필요할 때: File.ReadAllLines가 편리합니다. 배열로 반환되므로 인덱싱이 자유롭습니다.
- 인코딩 제어나 세부적인 스트림 처리가 필요할 때: StreamReader를 직접 사용하는 것이 가장 유연합니다.
일반적인 순차 읽기 작업이라면 코드가 간결하고 메모리 효율이 좋은 File.ReadLines가 가장 권장되는 선택입니다.