タイムアウトについて
* もし、重く時間が掛かる場合、タイムアウトを設定して中断することも考えなくてはならない。
■ Java1.8
http://www.ne.jp/asahi/hishidama/home/tech/java/process.html#Process_waitFor_timeoutによると、以下のように簡単に実装できるらしい boolean isDone = process.waitFor(10, TimeUnit.SECONDS);補足
* Java1.8では、他にも「process.isAlive()」など便利なメソッドが追加されている
■ Java1.7
http://chipmunkland.blog104.fc2.com/blog-entry-197.htmlを参考に実装してみる
サンプル
import java.io.BufferedReader; import java.io.InputStreamReader; public class Sample { private final static int Success = 0; private final static long Timeout = 10000; public static void main(String[] args) { try { ProcessBuilder processBuilder = new ProcessBuilder( "C:/Program Files/PostgreSQL/9.3/bin/pg_dump.exe", "-Fc", "-b", "-U", "postgres", "-f", "C:/temp/dump.out", "postgres"); // Merge Standard errors into Standard outputs processBuilder.redirectErrorStream(true); Process process = processBuilder.start(); try (InputStreamReader inputStreamReader = new InputStreamReader( process.getInputStream()); BufferedReader bufferedReader = new BufferedReader( inputStreamReader)) { boolean isDone = false; long startTime = System.currentTimeMillis(); while (System.currentTimeMillis() - startTime < Timeout) { if (inputStreamReader.ready()) { inputStreamReader.read(); } try { int exitValue = process.exitValue(); System.out.println("Exit Value : " + exitValue); if (exitValue == Success) { System.out.println("Success!"); } else { System.out.println("Failed..."); String errorMessage; while ((errorMessage = bufferedReader.readLine()) != null) { System.out.println(errorMessage); } } // The Process is done. isDone = true; break; } catch (IllegalThreadStateException ex) { // The process is still running. Thread.sleep(100); } } if (!isDone) { process.destroy(); } } System.out.println("Done "); } catch (Exception ex) { ex.printStackTrace(); } } }