ファイルによる画像データ授受 #3

一時ファイルが既に存在していた時のトラブルを避けるために、
作成時にまだ存在しないことが保証されているファイルを使うことにしよう。
また、プログラムと同じ場所に一時ファイルが置かれるのは行儀が悪いかもなので、
とりあえず一時ファイルを作成するのはシステムのデフォルトの場所に変更しよう。

import java.io.*;
import javax.imageio.ImageIO;

public class GnuplotUser6 {
    private static final String GNUPLOT = "/usr/bin/gnuplot";

    public static void main(String[] args) throws IOException, InterruptedException {
        Process p = new ProcessBuilder(GNUPLOT, "-").start();
        try (PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(p.getOutputStream())))) {
            File file = File.createTempFile("gpu", ".png");
            out.println("set terminal png");
            out.println("set output \"" + file.getCanonicalPath() +"\"");
            out.println("plot sin(x)");
            out.println("set output");
            out.flush();
            try (BufferedInputStream in = new BufferedInputStream(new FileInputStream(file))) {
                System.err.println(ImageIO.read(in));
            }
            file.delete();
        }
        p.waitFor();
    }
}

前項のコードとほとんど一緒である。
Fileオブジェクトを生成してファイルを実際に作る部分が、
上述したような一時ファイルを作成するFile#createTempFile()に置き換わっただけである。
一時ファイルはgpuで始まり.pngで終わるユニークな名前となる。

このコードでは一時ファイルの削除にFile#delete()を使っているが、

...snip
            File file = File.createTempFile("gpu", ".png");
            file.deleteOnExit();
            out.println("set terminal png");
...snip
                System.err.println(ImageIO.read(in));
            }
        }
        p.waitFor();
    }
}

のように作成後にFile#deleteOnExit()で削除マークを付けておくと、
delete()で明示的に削除しなくても、終了時にファイルを自動的に削除してくれる。
しかしこの場合の削除のタイミングはプログラムの終了時であるので、
大量に一時ファイルを作ったときは一時ファイル置き場がうるさい。
しかも仕様上、削除は正常終了した時に行われるので、削除されず残るかもしれない。
この一時ファイルは画像オブジェクトを生成すれば用済みなので早めに削除した方がいいと思う。
deleteOnExit()の使い所はファイルの削除をいつ行うべきか静的に決められないときであろう。