やっぱ、そういうことですかぁ〜
JavaFAQ > S103:外部コマンド呼出し > Q12:Runtime#exec()で実行した外部コマンドが動いていないようです。
で、標準出力/エラー出力を読んでて、処理が終了しててバッファが空なのか、処理中でバッファが空なのか判断できんから、別スレッドにせんとおえんってことか?
っちゅうことで、ここから辿って、antのorg.apache.tools.ant.taskdefs.Execを参考に、こんなクラス作ってみた。
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; /** * コマンド実行クラス */ public class CmdExec { private static final String LINE_SEP = System.getProperty("line.separator"); /** * プロセス */ private Process proc = null; /** * 標準出力バッファ読込 */ private BufReader stdOutBuf = null; /** * エラー出力バッファ読込 */ private BufReader errOutBuf = null; /** * デフォルトコンストラクタ */ public CmdExec() { super(); } /** * プロセスを取得する。 * @return Process */ public Process getProcess() { return this.proc; } /** * プロセスを設定する。 * @param proc Process */ private void setProcess(Process proc) { this.proc = proc; } /** * 標準出力バッファ読込を取得する。 * @return BufReader */ private BufReader getStdOutBuf() { return this.stdOutBuf; } /** * 標準出力バッファ読込を設定する。 * @param buf BufReader */ private void setStdOutBuf(BufReader buf) { this.stdOutBuf = buf; } /** * 標準出力を取得する。 * @return 標準出力 */ public String getStdOut() { if (getStdOutBuf() != null) { if (getStdOutBuf().getResult() != null) { return getStdOutBuf().getResult().toString(); } } return null; } /** * エラー出力バッファ読込を取得する。 * @return BufReader */ private BufReader getErrOutBuf() { return this.errOutBuf; } /** * エラー出力バッファ読込を設定する。 * @param buf BufReader */ private void setErrOutBuf(BufReader buf) { this.errOutBuf = buf; } /** * エラー出力を取得する。 * @return エラー出力 */ public String getErrOut() { if (getErrOutBuf() != null) { if (getErrOutBuf().getResult() != null) { return getErrOutBuf().getResult().toString(); } } return null; } /** * 実行する。 * @param cmd Command * @return result */ public int exec(String cmd) throws IOException, InterruptedException { return exec(cmd, false); } /** * 実行する。 * @param cmd Command * @param flag * @return result */ public int exec(String cmd, boolean flag) throws IOException, InterruptedException { setProcess(Runtime.getRuntime().exec(cmd)); setStdOutBuf(new BufReader(getProcess().getInputStream(), flag)); setErrOutBuf(new BufReader(getProcess().getErrorStream(), flag)); getStdOutBuf().start(); getErrOutBuf().start(); int ret = getProcess().waitFor(); getStdOutBuf().join(); getErrOutBuf().join(); return ret; } /** * バッファ読込クラス */ private class BufReader extends Thread { private InputStream is = null; private StringBuffer result = null; private BufReader(InputStream is, boolean flag) { this.is = is; if (flag == true) { this.result = new StringBuffer(); } } protected StringBuffer getResult() { return this.result; } @Override public void run() { try { BufferedReader buf = new BufferedReader(new InputStreamReader(is)); try { while (true) { String line = buf.readLine(); if (line != null) { if (this.result != null) { this.result.append(line); this.result.append(LINE_SEP); } } else { break; } } sleep(10); } catch (InterruptedException ie) { // コマンド終了 ie.printStackTrace(); } buf.close(); } catch (IOException ioe) { ioe.printStackTrace(); } } } }