System.IO名前空間にあるStreamReaderクラスを使用することで、テキストファイルのデータを読み込むことができます。
ここでは、StreamReaderクラスを使ってテキストファイルのデータを読み込む方法を紹介します。
本記事のサンプルコードを実行するには、以下の名前空間のusingが必要になります。
1 2 |
using System.Text; using System.IO; |
目次
StreamReaderクラスでテキストを読み込む
StreamReaderクラスにはテキストファイルからデータを読み込むためのメソッドがいくつか用意されています。
以下に主なメソッドを記載します。
メソッド | 説明 |
---|---|
ReadToEnd | ストリームのすべての文字(ストリームの現在位置から末尾までの文字)を読み込みます。 |
ReadToEndAsync | 非同期でストリームのすべての文字を読み込みます。 |
ReadLine | ストリームから1行分の文字列を読み込みます。 |
ReadLineAsync | 非同期でストリームから1行分の文字列を読み込みます。 |
すべての文字列データを読み込む
テキストファイルのすべてのデータを読み込むにはReadToEndメソッドを使用します。
以下にテキストファイルからデータを読み込む簡単な例を示します。
ここでは、C:\TextフォルダーにあるSample.txtファイルから文字列データを読み込んでいます。
1 2 3 4 5 6 7 8 9 10 |
// テキストファイルのパス string path = @"C:\Text\Sample.txt"; // StreamReaderオブジェクトのインスタンスを生成 StreamReader streamReader = new StreamReader(path); // ReadToEndメソッドですべての文字列データを読み込む string text = streamReader.ReadToEnd(); // StreamReaderオブジェクトを閉じる streamReader.Close(); Console.WriteLine(text); |
StreamReaderクラスのReadToEndメソッドでファイルから文字列データを読み込むために、コンストラクタの引数にファイルパスを指定して、StreamReaderオブジェクトのインスタンスを生成します。
ReadToEndメソッドは指定したパスのテキストファイルのデータを読み込みstring(文字列)を返します。
上記の例ではReadToEndメソッドの引数は指定していません。引数を指定せずにReadToEndメソッドを呼び出すと、ReadToEndメソッドは文字エンコーディングにUTF-8を使用して、テキストファイルのデータを読み込みます。
Closeメソッドを呼び出すことで、関連付けられたすべてのシステムリソースが解放されます。
文字エンコーディングを指定して読み込む
StreamReaderクラスには文字列データを読み込む際の文字エンコーディングを指定することができます。
以下に文字エンコーディングにShift-JISを指定して、テキストファイルからデータを読み込む例を示します。
1 2 3 4 5 6 7 8 9 10 |
// テキストファイルのパス string path = @"C:\Text\Sample-Shift_JIS.txt"; // StreamReaderオブジェクトのインスタンスを生成 StreamReader streamReader = new StreamReader(path, Encoding.GetEncoding("Shift_JIS")); // ReadToEndメソッドですべての文字列データを読み込む string text = streamReader.ReadToEnd(); // StreamReaderオブジェクトを閉じる streamReader.Close(); Console.WriteLine(text); |
文字エンコーディングを指定する際は、StreamReaderクラスのコンストラクタの引数に指定します。
StreamReaderクラスの各メソッドは指定された文字エンコーディングに従って文字列データを読み込みます。
文字エンコーディングの指定例をいくつか記載しておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
string path = @"C:\Text\Sample.txt"; // 日本語 Shift-JIS StreamReader srSjis = new StreamReader(path, Encoding.GetEncoding("shift_jis")); // 日本語 EUC StreamReader srEuc = new StreamReader(path, Encoding.GetEncoding("euc-jp")); // 日本語 JIS StreamReader srIso = new StreamReader(path, Encoding.GetEncoding("iso-2022-jp")); // Unicode StreamReader srUnicode = new StreamReader(path, Encoding.Unicode); // UTF-32 StreamReader srUtf32 = new StreamReader(path, Encoding.UTF32); // UTF-7 StreamReader srUtf7 = new StreamReader(path, Encoding.UTF7); // UTF-8 StreamReader srUtf8 = new StreamReader(path, Encoding.UTF8); |
Closeについて
StreamReaderクラスを使用した後はCloseメソッドでストリームを閉じるようにしますが、usingステートメントを使用することで、Closeメソッドを呼び出さずにシステムリソースを開放することができます。
以下にusingステートメントを使用したコード例を示します。
1 2 3 4 5 6 7 8 9 10 |
// テキストファイルのパス string path = @"C:\Text\Sample-Shift_JIS.txt"; // StreamReaderオブジェクトのインスタンスを生成 using (StreamReader streamReader = new StreamReader(path, Encoding.GetEncoding("Shift_JIS"))) { // ReadToEndメソッドですべての文字列データを読み込む string text = streamReader.ReadToEnd(); Console.WriteLine(text); } |
1行ずつ読み込む
ここまではStreamReaderクラスのReadToEndメソッドで、指定したテキストファイルのすべてのデータを一気に読み込んでいましたが。StreamReaderクラスには、1行ずつ文字列データを読み込むメソッドも用意されています。
テキストファイルから1行ずつデータを読み込むにはReadLineメソッドを使用します。
以下にReadLineメソッドでテキストファイルのデータを1行ずつ読み込むサンプルコードを示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// テキストファイルのパス string path = @"C:\Text\Sample.txt"; // StreamReaderオブジェクトのインスタンスを生成 using (StreamReader streamReader = new StreamReader(path)) { while (streamReader.Peek() >= 0) { // ReadLineメソッドで1行の文字列データを読み込む string text = streamReader.ReadLine(); Console.WriteLine(text); } } |
ReadLineメソッドで1行ずつ文字列データを読み込む時は、StreamReaderクラスのPeekメソッドを使って読み取り対象の文字が存在するかどうかを確認しながら処理していきます。Peekメソッドは読み取り対象の文字がない場合に-1を返します。
上記の例ではPeekメソッドの戻り値が0以上である間、ReadLineメソッドで1行の文字列データを読み取っています。
非同期で読み込む
StreamReaderクラスには非同期で文字列データを読み込むメソッドが用意されています。
ここまでサンプルで示してきたReadToEndメソッド、ReadLineメソッドにも対応する非同期読込用メソッドが用意されています。
以下にReadToEndメソッドに対応する非同期実行用のReadToEndAsyncメソッドを使用して、非同期でテキストファイルのデータを読み込むサンプルコードを示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
using System; // System.IO名前空間をusing using System.IO; File.OpenText(String) メソッド namespace ConsoleApplicationOpenText メソッド { class Program { static void Main() { ReadToEndAsyncSample(); } static async void ReadToEndAsyncSample() { string text = ""; // テキストファイルのパス string path = @"C:\Text\Sample.txt"; // StreamReaderオブジェクトのインスタンスを生成 using (StreamReader streamReader = new StreamReader(path)) { Console.WriteLine("Before"); // ReadToEndメソッドですべての文字列データを読み込む text = await streamReader.ReadToEndAsync(); Console.WriteLine("After"); } Console.WriteLine(text); } } } |
上記の例ではコンソールに「Before」が出力された後「After」が出力され、その後にテキストファイルから読み込んだデータが出力されます。
StreamReaderオブジェクトの生成
StreamReaderオブジェクトのインスタンスは、FileInfoクラスのOpenTextメソッド、またはFileクラスのOpenText静的メソッドで生成することもできます。
FileInfoクラスのOpenTextメソッド、またはFileクラスのOpenText静的メソッドで生成したStreamReaderオブジェクトの文字エンコーディングはUTF-8になります。
1 2 3 4 5 6 7 8 9 |
// テキストファイルのパスを指定してFileInfoオブジェクトのインスタンスを生成 FileInfo fileInfo = new FileInfo(@"C:\Text\Sample.txt"); // OpenTextメソッドでStreamReaderオブジェクトのインスタンスを生成 StreamReader srFromFileInfoClass = fileInfo.OpenText(); // テキストファイルのパス string path = @"C:\Text\Sample.txt"; // OpenText静的メソッドでStreamReaderオブジェクトのインスタンスを生成 StreamReader srFromFileClass = File.OpenText(path); |