【C#.NET解説】ファイルの作成・書き込み StreamWriterクラスの使用例や高速処理を解説

2024年11月12日火曜日

ファイル操作

t f B! P L

名前空間 System.IO

StreamWriter

自己紹介

こんにちは。「StreamWriter」は、C#.NETで文字列をファイルに書き込むための強力なクラスです。ログの記録、レポートの生成、データエクスポートなど、さまざまな場面で活躍します。「StreamReader」と共によく使われる双神の1柱です。
私たちはファイル操作において効率的で安全な方法を提供してくれる頼れる存在です。

基本機能

「StreamWriter」の基本機能として、文字列を簡単にファイルに書き込む方法をご紹介します。次のコードはその典型例です。

C#

// ファイルに文字列を書き込む基本例
using System;
using System.IO;

class Program
{
    static void Main()
    {
        string filePath = "example.txt";

        // StreamWriterを使って文字列を書き込む
        using (StreamWriter writer = new StreamWriter(filePath))
        {
            writer.WriteLine("これは1行目のテキストです。");
            writer.WriteLine("これは2行目のテキストです。");
        }

        Console.WriteLine("ファイルにデータを書き込みました。");
    }
}

このコードでは、「using」文を使用することで、リソース管理を自動化しています。これにより、コードが終了するとリソースが確実に解放されます。

よく使う場面と注意点

「StreamWriter」は、主にログファイルの生成やデータの保存に使用されます。特に注意すべき点として、ファイルがすでに存在する場合に上書きされる可能性があります。データを追記する場合は、第2引数に「true」を指定してください。

C#

// ファイルにデータを追記する例
using System;
using System.IO;

class Program
{
    static void Main()
    {
        string filePath = "example.txt";

        // 既存のファイルに追記する
        using (StreamWriter writer = new StreamWriter(filePath, true))
        {
            writer.WriteLine("追加されたテキスト行です。");
        }

        Console.WriteLine("ファイルに追記しました。");
    }
}

この方法を用いることで、重要なデータを上書きせず安全に操作することができます。

文字列を書き込むためのさまざまなメソッド

「StreamWriter」には複数の便利なメソッドが用意されています。特に「Write」と「WriteLine」は頻繁に使用されます。以下の例でその違いを確認してください。

C#

// WriteとWriteLineの違い
using System;
using System.IO;

class Program
{
    static void Main()
    {
        string filePath = "example.txt";

        using (StreamWriter writer = new StreamWriter(filePath))
        {
            writer.Write("この行は改行されません。");
            writer.WriteLine("この行は改行されます。");
            writer.Write("また改行されません。");
        }

        Console.WriteLine("ファイルに書き込みました。");
    }
}

「WriteLine」はデータを書き込んだ後に改行を追加しますが、「Write」はそのまま次の文字列を続けて書き込みます。

高速処理を可能にするバッファサイズ指定

バッファサイズを指定してファイルに書き込むことにより、IOを減らし高速かつ効率的に動作します。

C#

using System;
using System.Diagnostics;
using System.IO;

class Program
{
    static void Main()
    {
        string filePathBuffered = "buffered_output.txt";
        string filePathUnbuffered = "unbuffered_output.txt";
        int bufferSize = 8192; // バッファサイズ(例:8KB)

        int iterations = 100000;

        // 指定したバッファサイズで書き込み
        var watchBuffered = Stopwatch.StartNew();
        using (StreamWriter writer = new StreamWriter(filePathBuffered, false, System.Text.Encoding.UTF8, bufferSize))
        {
            for (int i = 0; i < iterations; i++)
            {
                writer.WriteLine($"Line {i}");
            }
        }
        watchBuffered.Stop();

        // バッファリングを無効にした書き込み
        var watchUnbuffered = Stopwatch.StartNew();
        using (StreamWriter writer = new StreamWriter(filePathUnbuffered, false))
        {
            writer.AutoFlush = true; // 自動フラッシュを有効にする
            for (int i = 0; i < iterations; i++)
            {
                writer.WriteLine($"Line {i}");
            }
        }
        watchUnbuffered.Stop();

        Console.WriteLine($"Buffered write with custom buffer size ({bufferSize} bytes): {watchBuffered.ElapsedMilliseconds} ms");
        Console.WriteLine($"Unbuffered write: {watchUnbuffered.ElapsedMilliseconds} ms");
    }
}

非同期処理を使用することで、アプリケーションのパフォーマンスを向上させることができます。

エンコーディングを指定して書き込む

「StreamWriter」は文字エンコーディングを指定することができます。たとえば、UTF-8でデータを書き込む場合は以下のように記述します。

C#

// エンコーディングを指定する例
using System;
using System.IO;
using System.Text;

class Program
{
    static void Main()
    {
        string filePath = "utf8Example.txt";

        using (StreamWriter writer = new StreamWriter(filePath, false, Encoding.UTF8))
        {
            writer.WriteLine("これはUTF-8でエンコードされたファイルです。");
        }

        Console.WriteLine("UTF-8エンコーディングで書き込みました。");
    }
}

正しいエンコーディングを指定することで、文字化けを防ぎ、異なるシステム間での互換性を確保することができます。

まとめ

「StreamWriter」は、ファイル操作を簡潔かつ効率的に行うためのクラスです。その柔軟なメソッドと設定可能なオプションを使いこなせば、プログラムの可能性が大きく広がります。この知識を実践に活用し、汝のスキルをさらに高めてください。

このブログを検索

QooQ