System.IO名前空間にあるStreamWriterクラスを使用することで、テキストファイルにデータを書き込むことができます。
ここでは、StreamWriterクラスを使ってテキストファイルにデータを書き込む方法を紹介します。
本記事のサンプルコードでは、以下の名前空間のusingが行われていることを前提としています。
1 2 |
using System.Text; using System.IO; |
目次
StreamWriterクラスでテキストを書き込む
StreamWriterクラスにはテキストファイルへデータを書き込むためのメソッドがいくつか用意されています。
以下に主なメソッドを記載します。
メソッド | 説明 |
---|---|
Write | ストリームに文字列、文字配列、文字などを書き込みます。 |
WriteAsync | 非同期でストリームに文字列、文字配列、文字などを書き込みます。 |
WriteLine | ストリームに1行分の文字列(文字列とそれに続く改行(行終端記号))を書き込みます。 |
WriteLineAsync | 非同期でストリームに1行分の文字列を書き込みます。 |
文字列を書き込む
テキストファイルにデータを書き込むにはWriteメソッドを使用します。
以下にテキストファイルへ文字列データを書き込む簡単な例を示します。
ここでは、C:\TextフォルダーにあるSample.txtファイルに文字列データを書き込んでいます。
1 2 3 4 5 6 7 8 9 10 11 |
// 書き込む文字列 string text = "書き込むテキスト1行目\r\n書き込むテキスト2行目"; // テキストファイルのパス string path = @"C:\Text\Sample.txt"; // StreamWriterオブジェクトのインスタンスを生成 StreamWriter streamWriter = new StreamWriter(path); // Writeメソッドで文字列データを書き込む streamWriter.Write(text); // StreamWriterオブジェクトを閉じる streamWriter.Close(); |
StreamWriterクラスのWriteメソッドでファイルから文字列データを書き込むために、コンストラクタの引数にファイルパスを指定して、StreamWriterオブジェクトのインスタンスを生成します。
Writeメソッドは指定したパスのテキストファイルに文字列データを書き込みます。
Closeメソッドを呼び出すことで、関連付けられたすべてのシステムリソースが解放されます。
既存のテキストファイルに追加で書き込む
StreamWriterクラスのWriteメソッドで既存のテキストファイルに追加で文字列を書き込むには、StreamWriterクラスのコンストラクタの第2引数にtrueを指定します。
1 2 3 4 5 6 7 8 9 10 11 |
// 書き込む文字列 string text = "追加で書き込むテキスト1行目\r\n追加で書き込むテキスト2行目"; // テキストファイルのパス string path = @"C:\Text\Sample.txt"; // StreamWriterオブジェクトのインスタンスを生成 StreamWriter streamWriter = new StreamWriter(path, true); // Writeメソッドで文字列データを書き込む streamWriter.Write(text); // StreamWriterオブジェクトを閉じる streamWriter.Close(); |
Writeメソッドで既存のファイルに追記すると、ファイルの末尾に文字列データが追加されます。第2引数にfalseを指定するとテキストファイルのデータは上書きされます。
上記の例ではWriteメソッドの引数に文字エンコーディングを指定していません。文字エンコーディングを指定せずにWriteメソッドを呼び出すと、Writeメソッドは文字エンコーディングにUTF-8を使用して、テキストファイルへデータを書き込みます。
文字エンコーディングを指定して書き込む
StreamWriterクラスには文字列データを書き込む際の文字エンコーディングを指定することができます。
以下に文字エンコーディングにShift-JISを指定して、テキストファイルからデータを書き込む例を示します。
1 2 3 4 5 6 7 8 9 10 11 |
// 書き込む文字列 string text = "書き込むテキスト1行目\r\n書き込むテキスト2行目"; // テキストファイルのパス string path = @"C:\Text\Sample.txt"; // StreamWriterオブジェクトのインスタンスを生成 StreamWriter streamWriter = new StreamWriter(path, false, Encoding.GetEncoding("Shift_JIS")); // Writeメソッドで文字列データを書き込む streamWriter.Write(text); // StreamWriterオブジェクトを閉じる streamWriter.Close(); |
文字エンコーディングを指定する際は、StreamWriterクラスのコンストラクタの引数に指定します。
StreamWriterクラスの各メソッドは指定された文字エンコーディングに従ってファイルに文字列データを書き込みます。
文字エンコーディングの指定例をいくつか挙げておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
string path = @"C:\Text\Sample.txt"; // 日本語 Shift-JIS StreamWriter srSjis = new StreamWriter(path, Encoding.GetEncoding("shift_jis")); // 日本語 EUC StreamWriter srEuc = new StreamWriter(path, Encoding.GetEncoding("euc-jp")); // 日本語 JIS StreamWriter srIso = new StreamWriter(path, Encoding.GetEncoding("iso-2022-jp")); // Unicode StreamWriter srUnicode = new StreamWriter(path, Encoding.Unicode); // UTF-32 StreamWriter srUtf32 = new StreamWriter(path, Encoding.UTF32); // UTF-7 StreamWriter srUtf7 = new StreamWriter(path, Encoding.UTF7); // UTF-8 StreamWriter srUtf8 = new StreamWriter(path, Encoding.UTF8); |
Closeについて
StreamWriterクラスを使用した後はCloseメソッドでストリームを閉じるようにしますが、usingステートメントを使用することで、Closeメソッドを呼び出さずにシステムリソースを開放することができます。
以下にusingステートメントを使用したコード例を示します。
1 2 3 4 5 6 7 8 9 10 11 |
// 書き込む文字列 string text = "書き込むテキスト1行目\r\n書き込むテキスト2行目"; // テキストファイルのパス string path = @"C:\Text\Sample.txt"; // StreamWriterオブジェクトのインスタンスを生成 using (StreamWriter streamWriter = new StreamWriter(path)) { // Writeメソッドで文字列データを書き込む streamWriter.Write(text); } |
1行ずつ書き込む
ここまではStreamWriterクラスのWriteメソッドで、指定したテキストファイルに文字列データを一気に書き込んでいましたが。StreamWriterクラスには、1行ずつ文字列データを書き込むメソッドも用意されています。
文字列をテキストファイルへ1行ずつデータを書き込むにはWriteLineメソッドを使用します。
以下にWriteLineメソッドでテキストファイルへ1行ずつ文字列を書き込むサンプルコードを示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// 書き込む文字列 string[] textLines = new string[] { "書き込むテキスト1行目", "書き込むテキスト2行目", "書き込むテキスト3行目" }; // テキストファイルのパス string path = @"C:\Text\Sample.txt"; // StreamWriterオブジェクトのインスタンスを生成 using (StreamWriter streamWriter = new StreamWriter(path)) { foreach (string text in textLines) { streamWriter.WriteLine(text); } } |
WriteLineメソッドで文字列データを書き込むと、テキストファイルに1行分の文字列と改行(行の終端記号)が出力されます。
非同期で書き込む
StreamWriterクラスには非同期で文字列データを書き込むメソッドが用意されています。
ここまでサンプルで示してきたWriteメソッド、WriteLineメソッドにも対応する非同期読込用メソッドが用意されています。
以下にWriteメソッドに対応する非同期実行用のWriteAsyncメソッドを使用して、非同期でテキストファイルのデータを書き込むサンプルコードを示します。
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 |
using System; // System.IO名前空間をusing using System.IO; namespace ConsoleApplication { class Program { static void Main() { WriteAsyncSample(); } static async void WriteAsyncSample() { // 書き込む文字列 string text = "書き込むテキスト1行目\r\n書き込むテキスト2行目"; // テキストファイルのパス string path = @"C:\Text\Sample.txt"; // StreamWriterオブジェクトのインスタンスを生成 using (StreamWriter streamWriter = new StreamWriter(path)) { // Writeメソッドですべての文字列データを書き込む await streamWriter.WriteAsync(text); } } } } |
StreamWriterオブジェクトの生成
StreamWriterオブジェクトのインスタンスは、FileInfoクラスのAppendTextメソッド、CreateTextメソッド、またはFileクラスのAppendText静的メソッド、CreateText静的メソッドで生成することもできます。
FileInfoクラスのAppendTextメソッド、CreateTextメソッド、またはFileクラスのAppendText静的メソッド、CreateText静的メソッドで生成したStreamWriterオブジェクトの文字エンコーディングはUTF-8になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// テキストファイルのパスを指定してFileInfoオブジェクトのインスタンスを生成 FileInfo fileInfo = new FileInfo(@"C:\Text\Sample.txt"); // AppendTextメソッドでStreamWriterオブジェクトのインスタンスを生成 StreamWriter srAppendFromFileInfoClass = fileInfo.AppendText(); // CreateTextメソッドでStreamWriterオブジェクトのインスタンスを生成 StreamWriter srCreateFromFileInfoClass = fileInfo.CreateText(); // テキストファイルのパス string path = @"C:\Text\Sample.txt"; // AppendText静的メソッドでStreamWriterオブジェクトのインスタンスを生成 StreamWriter srAppendFromFileClass = File.AppendText(path); // CreateText静的メソッドでStreamWriterオブジェクトのインスタンスを生成 StreamWriter srCreateFromFileClass = File.CreateText(path); |
FileInfoクラスのAppendTextメソッド、またはFileクラスのAppendText静的メソッドで作成したStreamWriterオブジェクトは、既存のファイルに追加で書き込みます。
FileInfoクラスのCreateTextメソッド、またはFileクラスのCreateText静的メソッドで作成したStreamWriterオブジェクトは、既存のファイルに上書きで書き込みます。