ファイルによる画像データ授受 #2
根拠のない数値が入ったままではいや〜んなので除去してみる。
Java側でファイルの存在を確認して開くというのでもいいかもしれないが、
逆転の発想でgnuplotがファイルを作成する前にJavaでファイルを作ってしまおう。
Javaで例外が発生するのはファイルが存在しないからであり、
先にJavaで上書き可能なファイルを作成しておいて、
gnuplotがこのファイルに画像データを上書きするようにすれば、
ファイル中に画像データがまだ存在していなくても開くことだけはできる。
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 = new File("gnuplotuser6temporary.png"); file.createNewFile(); 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#createNewFile()
でまずファイルを作成している。
これで一旦停止を指示しなくてもファイルを開くことができる。
画像データが開かれたあとで書き込まれ始めても、
それを待つ仕事はImageIO#read(InputStream)
がやってくれるので、
こちらは特に何も書く必要がない。
基本的にはこれで大丈夫だと思うが、
もしファイルがこのプログラムの実行以前から存在している場合に問題となる可能性がある。
既存のファイルが書き潰される問題だけでなく、
書き込みと読み込みのタイミング次第でImageIO#read(InputStream)
が失敗するかも。