テキストファイルの中身を読む方法はいくつかありますが、File.ReadLines メソッドは**「必要な分だけ少しずつ読み込む(遅延実行)」**という特性を持っており、ログファイルのような巨大なファイルを扱う際や、先頭の数行だけを確認したい場合に非常にメモリ効率が良い方法です。
目次
実装サンプル:先頭10行の読み込み
以下のコードでは、ファイル全体をメモリに読み込むのではなく、1行ずつ取得しながら処理を行い、10行読み終わった時点で読み込みを停止します。
サンプルコード
using System;
using System.IO;
using System.Linq; // Takeメソッドなどを使うために必要
public class Program
{
public static void Main()
{
// 読み込み対象のファイルパス
string filePath = "example.txt";
// 1. テスト用にダミーファイルを作成 (100行分)
if (!File.Exists(filePath))
{
// 100行のデータを持つファイルを作る
File.WriteAllLines(filePath, Enumerable.Range(1, 100).Select(i => $"Line Number {i}"));
}
Console.WriteLine($"--- {filePath} の先頭10行を表示 ---");
// 2. File.ReadLines で読み込む
// この時点ではまだファイル全体は読み込まれていません
var lines = File.ReadLines(filePath);
// Take(10) を使うことで、10行読んだ時点でファイルアクセスが終了します
foreach (var line in lines.Take(10))
{
Console.WriteLine(line);
}
}
}
実行結果
--- example.txt の先頭10行を表示 ---
Line Number 1
Line Number 2
...
Line Number 10
解説と読み込みメソッドの使い分け
C# にはファイルを読むメソッドがいくつかあり、用途に合わせて使い分けるのが重要です。
| メソッド | 戻り値 | 特徴・使いどころ |
File.ReadLines | IEnumerable<string> | おすすめ。1行ずつ読み込みます(遅延実行)。ループ処理 (foreach) や LINQ で加工しながら読む場合に最適で、メモリ消費が少ないです。 |
File.ReadAllText | string | ファイルの中身をすべて連結した1つの文字列として取得します。JSONのパースや、正規表現で全体を検索したい場合に使います。 |
File.ReadAllLines | string[] | 全行を読み込んで文字列の配列にします。行数が少なく、ランダムアクセス(lines[5]のように特定の行をすぐ取りたい)したい場合に便利です。 |
なぜ ReadLines が良いのか?
ReadAllLines を使って数GBあるログファイルを読み込むと、すべてのデータを配列としてメモリ上に展開しようとするため、メモリ不足エラー(OutOfMemoryException)になる可能性があります。
一方、ReadLines は foreach で回っている「その瞬間」の行だけをメモリに置くため、巨大なファイルでも安全に扱えます。
