一時ファイルの利用

アプリケーション等で一時的にデータを格納しておく要件があった場合、物理メモリに比べてリソースコストの安いローカルストレージ等のファイルに待避するという選択肢は良く使われます。
拙作のフレームワークの例であればPDF帳票を一時的に生成する先に利用したり、スマートクライアントでHTTP-over-XML通信を行う際に通信が失敗した際に再送に使用するために通信イメージを出力したストリームを一時的に待避するために利用したりしています。

Java(私はまだJ2SE1.5(5.0)を真っ当に評価してないので以下J2SE1.4以降を前提)の場合はFileクラスに静的なメソッドが用意されており、簡単に使えます。

File#createTempFile(String prefix, String suffix) 
File#createTempFile(String prefix, String suffix, File directory) 

前者はデフォルトの一時ファイル用ディレクトリ、後者は指定されたディレクトリに一時ファイルを生成してFileクラスのインスタンスを返してくれるのでそれを使えば良いです。ただし、作成した一時ファイルはそのままでは削除することができずdeleteOnExit()メソッドにより仮想マシンが終了する際に削除対象とすることはできますがプラットホームによってはファイルの削除ができないケースもあり、そもそもサーバアプリケーションの場合Java仮想マシンがシャットダウンする迄は一時ファイルが残り続けるのが問題になる場合もあり、その為に独自の一時ファイルマネジャが書かれるケースもあります。(Win32プラットホーム上では私も同様の問題に遭遇しておりリンクの例とは違いますがやはり独自に一時ファイル制御用のクラスを書いて対処しています)

.NET Frameworkでの一時ファイルの制御はどうかというと、Javaと同名のFileクラスやユーティリティ的な使い勝手の良いFileInfoクラスには、一時ファイル用のメソッドはありませんが逆に一時ファイル専用のクラスが存在しています。それがTempFileCollectionクラスです。

TempFileCollectionクラス(MSDN)

使い方は非常に簡単でデフォルトの一時ファイルディレクトリを利用するのであれば、以下のようなコーディングで一時ファイルの生成〜利用、削除までを制御できます。

デフォルトの一時ファイルディレクトリに拡張子"tmp" + サフィクスにファイルの連番を付けたファイルを10個生成してストリームとして使用、後に削除するサンプル

TempFileCollection tmpFiles = new TempFileCollection();
try
{
    for ( int i = 0; i < 10; i++)
    {
        string tempFileName = tmpFiles.AddExtension("tmp" + i);
        FileInfo info = new FileInfo(tempFileName);
        using (FileStream strm = info.Create())
        {
            //作られたファイルストリームを利用する処理 〜
        };
    }
}
finally
{
    tmpFiles.Delete();
}

AddExtensionメソッドにより特定の拡張子を持ったファイルが自動的にコレクションに追加されますが、これはファイルの実体が作られる訳ではなく単に名前が予約されるだけなので、実際に一時ファイルを利用する為には、同メソッドが戻したファイル名で実ファイルを生成してやる必要があります。また、Addメソッドによりファイル名を任意に指定して、一時ファィルのコレクションに追加することもできます。
(AddExtensionメソッドによる予約されるファイル名はTempFileCollectionクラスを生成する毎に、ランダムで生成されたプレフィクスが割り当てられるようです)
finallyブロックに書かれているDelete()メソッドはこのTempFileCollectionクラスのインスタンスで以前に追加された一時ファイルのうち、"保持する"とマークされていないファイルを全て削除します。冒頭で書いたJavaの一時ファイル制御とは違い、このメソッドが実行されると権限上の問題がない限りは即座にファイルが削除されるので余計な制御コードは不要でありすっきりします。

TempFileCollectionクラスで唯一ひっかかるとすればこのクラスが属するネームスペース(System.CodeDom.Compiler)でしょう。こんな便利なクラスを他の用途で使うな、という訳ではないのでしょうけどこのネームスペースに属しているのは理解に苦しみます。

追記:

id:dotnetfanさんからのコメントして頂きました。そのご指摘の通り、一時ファイル取得本来の目的に為にはPath#GetTempFileName()というメソッドがきちんと用意されていることが判明しました。(というか私がこのメソッドの存在を全く考慮していませんでした(汗)。
一通りのサンプルまで書きましたがこのクラスはMSDNに書いてある通り、コンパイルに使用するものであり、ネームスペースも妥当でした。失礼しました。