1. 基本概念
コンピュータプログラミングにおいて、ストリームは多くのファイルの入出力操作をクラスのメンバ関数として提供するオブジェクトです。情報の変換を表すもので、順序のある流れを特徴とします。あるオブジェクトが外部から情報を受信することを「入力ストリーム」、逆にそのオブジェクトから情報を送ることを「出力ストリーム」と呼びます。
オブジェクト間でのデータ交換では、通常データを特定の形式のストリームに変換し、それを伝送して目的のオブジェクトに戻します。このため、ストリームはデータのキャリアと考えられ、データの交換や伝送を実現します。
System.IO名前空間には、テキストファイルや画像・音声ファイル、バイナリーファイルなどの読み書きを行うためのクラスが含まれています。これらのクラスを使用するには、プログラム冒頭で「using System.IO;」を指定する必要があります。
2. C#における主要なクラスとその役割
- BinaryReader: 特定のエンコーディングを使用して基本データ型をバイナリ値として読み取ります。
- BinaryWriter: バイナリ形式で基本データ型をストリームに書き込みます。
- Stream: 抽象クラスであり、以下の派生クラスがあります。
- MemoryStream: メモリに対して読み書きを行います。
- BufferedStream: バッファリングされた読み書きを別のストリームに追加します。
- FileStream: ファイルに対する読み書きをサポートします。
- TextReader: 抽象クラスで、以下が派生しています。
- StringReader: 文字列からの読み取りを実行します。
- StreamReader: 特定のエンコーディングを使用してバイトストリームから文字を読み取ります。
- TextWriter: 抽象クラスで、以下が派生しています。
- StringWriter: 文字列への書き込みを実行します。
- StreamWriter: 特定のエンコーディングを使用してストリームに文字を書き込みます。
3. 主要なクラスの使用例
(1) FileStreamを使用したバイナリーファイルの読み書き
(2) StreamReaderを使用したテキストファイルの読み書き
テキストファイルの読み書きには一般的にStreamReaderとStreamWriterを使用します。これらは自動的に異なるエンコーディングに対応するため、手動でエンコーディングを気にする必要はありません。
StreamReaderの使用例
| メソッド | 説明 |
| Encoding CurrentEncoding | 現在のストリームで使用されているエンコーディングを取得します。 |
| bool EndOfStream | ストリームの終端かどうかを返します。 |
| void Close() | ストリームを閉じます。 |
| int Peek() | 次の文字を取得します(読み取らずに確認)。 |
| int Read() | 次の文字を読み取ります。 |
| string ReadLine() | 一行を読み取ります。 |
| string ReadToEnd() | ストリームの終端まですべてを読み取ります。 |
サンプルコード
// テキストファイルの読み込み
using (var reader = new StreamReader("example.txt", Encoding.UTF8))
{
string line;
while ((line = reader.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
// テキストファイルの書き込み
using (var writer = new StreamWriter("output.txt", true, Encoding.UTF8))
{
writer.WriteLine("新しい行を追加します。");
}
簡易デモ
// ファイル作成と書き込み
if (!File.Exists("data.txt"))
{
using (var writer = File.CreateText("data.txt"))
{
writer.WriteLine("こんにちは!");
}
}
// 読み込み
string content = File.ReadAllText("data.txt");
Console.WriteLine(content);
// 上書き書き込み
File.WriteAllText("data.txt", "これは上書き内容です。");
content = File.ReadAllText("data.txt");
Console.WriteLine(content);
// コピー
File.Copy("data.txt", "copied_data.txt");
// 移動
File.Move("data.txt", "moved_data.txt");
// 削除
File.Delete("copied_data.txt");