C# でストリームをファイルに保存するコード例
C# でストリームをファイルに保存する方法
C# では、ストリームをファイルに保存するために、FileStream
クラスを使用します。このクラスは、ファイルへの読み書き操作を提供します。
ステップ
FileStream オブジェクトの作成:
FileStream
クラスのコンストラクタを使用し、ファイルパスとファイルアクセスモードを指定します。- 例:
FileStream fileStream = new FileStream("output.txt", FileMode.Create);
ストリームの書き込み:
FileStream
オブジェクトのWrite
メソッドを使用して、ストリームからデータをファイルに書き込みます。
ストリームのクローズ:
FileStream
オブジェクトのClose
メソッドまたはDispose
メソッドを使用して、ストリームを閉じます。- 例:
fileStream.Close();
例
以下のコードは、ストリームをファイルに保存する例です。
using System;
using System.IO;
namespace StreamToFileExample
{
class Program
{
static void Main(string[] args)
{
// 入力ストリーム (例: ネットワークストリーム)
MemoryStream inputStream = new MemoryStream(new byte[] { 0x41, 0x42, 0x43 });
// ファイルストリームを作成
FileStream fileStream = new FileStream("output.txt", FileMode.Create);
// ストリームからファイルに書き込む
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = inputStream.Read(buffer, 0, buffer.Length)) > 0)
{
fileStream.Write(buffer, 0, bytesRead);
}
// ストリームを閉じる
fileStream.Close();
}
}
}
基本的な例
using System;
using System.IO;
class Program
{
static void Main(string[] args)
{
// 入力ストリーム (例: ネットワークストリーム)
MemoryStream inputStream = new MemoryStream(new byte[] { 0x41, 0x42, 0x43 });
// ファイルストリームを作成
FileStream fileStream = new FileStream("output.txt", FileMode.Create);
// ストリームからファイルに書き込む
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = inputStream.Read(buffer, 0, buffer.Length)) > 0)
{
fileStream.Write(buffer, 0, bytesRead);
}
// ストリームを閉じる
fileStream.Close();
}
}
詳しい解説
入力ストリーム:
MemoryStream
を使用して、メモリ上のバッファをストリームとして扱っています。- 実際のアプリケーションでは、ネットワークストリーム、ファイルストリームなどを使用します。
ファイルストリーム:
FileStream
を使用して、ファイルへの読み書き操作を行います。FileMode.Create
を指定することで、ファイルが存在しない場合は新しく作成し、存在する場合は上書きします。
ストリームの読み書き:
Read
メソッドを使用して、入力ストリームからバッファにデータを読み込みます。Write
メソッドを使用して、バッファの内容をファイルストリームに書き込みます。- バッファサイズは適宜調整してください。
Close
メソッドを使用して、ストリームを閉じます。- 適切なリソース管理のために、
using
ステートメントを使用することもできます。
拡張例
- ファイルが存在する場合の処理:
FileMode.Append // ファイルに追加する FileMode.OpenOrCreate // ファイルが存在しない場合は作成し、存在する場合は開く
- エラー処理:
try { // ストリーム操作 } catch (IOException ex) { Console.WriteLine("エラーが発生しました: " + ex.Message); }
- 非同期操作:
await fileStream.WriteAsync(buffer, 0, bytesRead);
File.WriteAllBytes メソッド
- 効率的な方法でバイト配列をファイルに直接書き込むことができます。
- 例:
byte[] data = ...; File.WriteAllBytes("output.txt", data);
BinaryWriter クラス
- ストリームにバイナリデータを書き込むためのクラスです。
- 例:
using (BinaryWriter writer = new BinaryWriter(new FileStream("output.txt", FileMode.Create))) { writer.Write(data); }
StreamWriter クラス
- 例:
using (StreamWriter writer = new StreamWriter("output.txt")) { writer.WriteLine("Hello, world!"); }
Task.Run メソッドによる非同期処理
- 長時間の操作を非同期に行うことができます。
- 例:
Task.Run(() => { // ストリームの読み書き処理 });
Async/Await キーワードによる非同期処理
- より自然な非同期プログラミングが可能になります。
- 例:
async Task SaveStreamAsync(Stream inputStream, string filePath) { using (FileStream fileStream = new FileStream(filePath, FileMode.Create)) { await inputStream.CopyToAsync(fileStream); } }
c# .net stream