ホームに戻る
出典 :
目次 :
System.IO.StreamWriter とは
文字を特定のエンコーディングでストリームに書き込むための一連の機能を提供する。
ここでは、主用途のひとつであるテキストファイルへの書き込みに関して記す。
StreamWriter はスレッドセーフではなく、マルチスレッドで用いる場合は競合が発生しないような措置が必要となる(後述)。
書き込み動作のイメージ

通常、StreamWriter に書き込まれた内容はバッファに保持され、バッファをフラッシュしない限りはファイルへの反映はなされない。
Flush() 、Close() または Dispose() を行うことでバッファがフラッシュされる。
AutoFlush プロパティを true に設定すると、Flush() を明示的に呼び出さなくてもバッファへの書き込みが行われるごとに自動的にフラッシュを行うようにできる。
(但しフラッシュの頻度が上がるため、パフォーマンスへの影響は発生する。)
一般的な実装 (C#)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace StreamWrite
{
class Program
{
// Main() メソッド
static void Main(string[] args)
{
// C: ドライブ中のディレクトリ情報を取得
DirectoryInfo[] cDirs = new DirectoryInfo(@"c:\").GetDirectories();
// 書き込み先のファイル名を指定して StreamWriter を生成
// using 節を抜ける際に Dispose() する
using ( StreamWriter sw = new StreamWriter("CDriveDirs.txt") )
{
// ディレクトリ情報をスキャン
foreach (DirectoryInfo dir in cDirs)
{
// ストリームにディレクトリ名を書き込む
sw.WriteLine(dir.Name);
}
}
}
}
}
コンストラクタ
主要なものを抜粋。その他詳細は
出典元
を参照のこと。
文字エンコーディングを指定しない場合は既定値UTF-8( UTF8Encoding )(BOMなし)が用いられる。
既存のファイルに対する書き込みモード(上書き・末尾に追記)も指定できるが、省略した場合は上書きとなる。いずれの場合も、ファイルが存在しない場合は新たに作成される。
|
引数 |
StreamWriter(String) |
String |
書き込み先のファイルパス |
StreamWriter(String, Boolean) |
String |
書き込み先のファイルパス |
Boolean |
書き込みモード(追記を行うか) true : 追記 false : 上書き |
StreamWriter(String, Boolean, Encoding) |
String |
書き込み先のファイルパス |
Boolean |
書き込みモード(追記を行うか) true : 追記 false : 上書き |
Encoding |
文字エンコーディング |
メソッド
主要なものを抜粋。詳細は
出典元
を参照のこと。
|
引数 |
戻り値 |
解説 |
Close() |
なし |
なし |
StreamWriter オブジェクトと、基になるストリームを閉じる。その際にバッファをフラッシュする。
Dispose() で代用可能。 |
Dispose() |
なし |
StreamWriter オブジェクトが使用するすべてのリソースを解放する。
バッファにデータが残っている場合はフラッシュする。 |
Flush() |
なし |
バッファ内のデータを基になるストリームに書き込み、バッファをクリアする。 |
FlushAsync() |
System.Threading.Tasks.Task |
非同期タスク |
Flush() と同様の処理を非同期に行う。 |
Write() |
string など |
なし |
引数で指定した値をストリームに書き込む。 |
WriteAsync() |
System.Threading.Tasks.Task |
非同期タスク |
Write() と同様の処理を非同期に行う。 |
WriteLine() |
なし |
引数で指定した値と行終端記号(改行文字)をストリームに書き込む。 引数なしの場合は行終端記号のみを書き込む。 |
WriteLineAsync() |
System.Threading.Tasks.Task |
非同期タスク |
WriteLine() と同様の処理を非同期に行う。 |
StreamWriter のスレッドセーフ化
先述の通り、StreamWriter はスレッドセーフではない。但し TextWriter.Synchronized() メソッドを用いることでスレッドセーフなラッパーを作成することができる。
尚、ここで返却されるのは StreamWriter の基底クラスである抽象クラス TextWriter のインスタンスとなる。
using System.IO;
namespace Sample
{
class Program
{
// 書き込み用ストリーム (TextWriter)
private TextWriter m_Stream;
// コンストラクタ
public Program()
{
// StreamWriter 生成
StreamWriter sw = new StreamWriter("sample.txt");
// StreamWriter をスレッドセーフラッパーに変換
m_Stream = TextWriter.Synchronized(sw);
}
static void DoSomething()
{
// スレッドセーフラッパーを使用した書き込み
m_Stream.WriteLineAsync("DoSomething");
}
}
}