あるプログラマの日記

プログラマのメモ、出来事、考えたこと、勉強とかの雑記

テンポラリファイル作成

java でテンポラリファイルを作成してくれるメソッドがあった。
File#createTempFile

  • 指定ディレクトリで新しい空のファイルを生成する。
  • そのファイル名には引数で指定した接頭辞、接尾辞が使用される。
  • このメソッドが正常に復帰する場合、以下が保証される
    1. 返された抽象パス名のファイルが存在するのは、このメソッドが呼び出された後になる。
    2. JVM の現在の呼び出しで再度同じパス名は返さない。

繰り返し作成する一時ファイルの名前の一意性を気にする必要がないので、その点で便利である。

import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.IOException;
import edu.umd.cs.findbugs.annotations.NonNull;
import edu.umd.cs.findbugs.annotations.CheckForNull;
...
    final String tmpDir = "foo";
    final String prefix = "bar";
    final String suffix = null; // null の場合は ".tmp" になる。
    OutputStream os = null;
    File tmp = null;
    try {
        tmp = File.createTempFile(prefix, suffix, new File(tmpDir));
        os = new FileOutputStream(tmp);
      final byte[] buffer = getData();
        os.write(buffer);
    }
    catch (IOException x) {
        log.fatal("", x);
    }
    finally {
        // os null check, check IOException
        close(os);
        // tmp null check, delete return check
        delete(tmp);
    }
..
    public static void close(@CheckForNull Closeable s, boolean putlog) {
        if (s == null) return;
        try { s.close(); }
        catch (IOException x) {
            if (putlog) log.error("", x);
        }
    }
..
    public static boolean delete(@CheckForNull File f) {
        if (f == null || !f.exists()) return true;
        boolean result = f.delete();
        if (!result) log.fatal(f.getPath(), new Throwable());
        return result;
    }
..