この記事では、Javaのプログラムから外部プログラムを実行させる方法について解説していきたいと思います。
1. はじめに
私はFortranで開発されたプログラム、あるいは別途開発された既存のプログラムをコマンドラインから使うことがあります。これらのプログラムを使う際に繰り返し連続処理したり、データの前処理や後処理も一緒にしたい場合もあります。
制御が簡単な場合はバッチジョブやジョブスクリプトで一連の操作をプログラムすることも可能ですが、処理が複雑になったり、配布して他の人にも使ってもらうアプリとして完成させたい場合は、アプリ開発用言語で開発する必要があります。
この記事では、私が普段プログラミングで使っているJavaで外部プログラムを実行する方法を解説していきたいと思います。
2. 実行環境
ここでは、使用OSをWindows11(64bit)として開発言語はJavaを用いています。マルチOS開発言語のJavaで開発していますので、外部プログラムの実行コマンド部分を変えてコンパイルしなおせば他のOS上でも動くと思います。
3. プログラムの解説
7行目から16行目がmain関数で、この関数からプログラムが実行されます。
8行目で実行されるコマンドの文字列を定義しています。この部分を書き換えれば、他のコマンドや外部プログラムが実行できます。
9行目で外部プログラムからの戻り値の文字列を格納するための変数を定義しています。
11行目のexecute関数でコマンドが実行されます。
10行目から14行目のtry-catch構文でexecute関数の例外処理を行っています。
15行目で外部プログラムからの戻り値の文字列をターミナル画面に出力します。
19行目から29行目で外部プログラムを実数するための関数executeを定義しています。この関数の引数にコマンドの文字列を代入します。この方法では例外が発生する可能性があるので、throwsキーワードで例外処理しています。
20、21行目で外部コマンドを実行しています。20行目でRuntimeを取得し、21行目でexecメソッドでプロセスを実行しています。
22行目から28行目で外部プログラムからの戻り値を取得します。
Test_BatchJob.java
package net.gofort; import java.io.BufferedReader; import java.io.InputStreamReader; public class Test_BatchJob { public static void main (String[] args) { String cmdLine = "hello_world.exe"; String out = ""; try { out = execute(cmdLine); } catch (Exception ex) { ex.printStackTrace(); } System.out.println(out); } // Command Execution private static String execute(String cmd) throws Exception { Runtime rt = Runtime.getRuntime(); Process ps = rt.exec(cmd); BufferedReader reader = new BufferedReader(new InputStreamReader(ps.getInputStream())); StringBuilder ret = new StringBuilder(); String line = null; while((line = reader.readLine()) != null){ ret.append(line).append("\n"); } return ret.toString(); } }
4. プログラムの使い方
まず、プログラムを実行する前提としてJavaの開発環境(JDK)がインストールされている必要があります。
下記のリンクからプログラムのソースコードをローカルPCにダウンロードし、解凍します。解凍したフォルダの中に「compile.cmd」、「execute.cmd」と「hello_world.exe」という3つのファイルと「net」というフォルダがあるのが確認できます。
下記のリンクからプログラムのソースコードをローカルPCにダウンロードし、解凍します。解凍したフォルダの中に「compile.cmd」、「execute.cmd」と「hello_world.exe」という3つのファイルと「net」というフォルダがあるのが確認できます。
そして、「execute.cmd」を実行すると、外部プログラムである 「hello_world.exe」の戻り値の「Hello World!」にが表示されます。
5. その他
このJavaプログラムから外部プログラムを動かすことはできますが、システムコマンド(cdやmkdir等)はファイルが見つからないというエラーが出て実行できませんでした。原因は不明です。
6. まとめ
この記事ではJavaのプログラムから外部プログラムを実行させる方法について解説しました。ポイントをまとめると下記のようになります。
- 外部プログラムを実行するときは、Runtimeを取得してからexecメソッドでプロセスを実行します。
- この方法では例外が発生する可能性があるので、例外処理の記述を加える必要があります。
- この方法では何故かシステムコマンド(cdやmkdir等)は実行できませんでした。
以上、最後まで読んでいただきありがとうございました。