感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

外部コマンドを実行する

<スポンサーリンク>

引数にコマンド名を指定すると、外部コマンドを実行することができます。
このサンプルでは、以下のhoge.batというバッチファイル(DOS)を実行してみます。

echo "hoge"
type nul > "C:\tmp\emptyfile.txt"

type nul > ~
というのは、DOSでファイルを作成するコマンドです。

■サンプル

package batch;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class BatchExecutor {

	public String[] execCommand(String cmd) throws IOException, InterruptedException {
		String[] returnMessages = new String[3];
		String sepa = System.getProperty("line.separator");

		Runtime r = Runtime.getRuntime();
		Process p = r.exec(cmd);
		InputStream in = null;
		BufferedReader br = null;

		try {
			in = p.getInputStream();
			StringBuffer out = new StringBuffer();
			br = new BufferedReader(new InputStreamReader(in));
			String line;
			while ((line = br.readLine()) != null) {
				out.append(line + sepa);
				System.out.print(line + sepa);
			}

			returnMessages[0] = out.toString();
			br.close();
			in.close();

			in = p.getErrorStream();
			StringBuffer err = new StringBuffer();
			br = new BufferedReader(new InputStreamReader(in));

			while((line = br.readLine()) != null) {
				err.append(line + sepa);
				System.out.print(line + sepa);
			}

			returnMessages[1] = err.toString();
			returnMessages[2] = Integer.toString(p.waitFor());

			return returnMessages;
		} finally {
			if (br != null) {
				br.close();
			}
			if (in != null) {
				in.close();
			}
		}
	}
}

これをJUnitから実行してみます。

package batch;

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;

import org.junit.Test;

public class BatchExecutorTest {

	@Test
	public void cmdexeが実行できること() throws Exception {
		BatchExecutor be = new BatchExecutor();
		String[] actual = be.execCommand("C:\\tmp\\hoge.bat");
		assertThat(actual[0],containsString("hoge"));
	}

}

結果はグリーン。
ファイルも作成されます。

これで、外部コマンドを実行することができました。


Java ポケットリファレンス

Java ポケットリファレンス