S_a_k_Uの日記みたいなDB

~サクゥーと呼ばないで~

Windows(MS-DOS)バッチファイルの実行 の続き

やっぱ、そういうことですかぁ〜
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();
			}
		}
	}

}