JavaマスターJavaプログラムサンプル集プロセスのサンプル → 外部プログラムを実行して結果を取得する

外部プログラムを実行して結果を取得する

Javaプログラムから外部のプログラムを実行し、その出力や返り値を取得する 方法を紹介します。

外部プログラムを呼び出すには、Runtimeクラスのexecメソッドを利用します。

execメソッドを実行すると、外部プログラムの実行が開始されます。 このとき、外部プログラムが終了するまでexecメソッドが一時停止することはありません。 つまり、このJavaプログラムと、外部プログラムが、同時に動いている状態となります。

外部プログラムが終了するときには、「終了コード」という数値を得ることができます。 0であれば正常に終了したことを、 その他であればエラーによって終了したことを表します。

外部プログラムが出力したテキストを取得するには、 getInputStreamメソッドで取得した入力ストリームから データを読み取ります。

samples/process/ProcessExecuteSample.java - Eclipse SDK
package samples.process;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringWriter;

public class ProcessExecuteSample {
  public static void main(String[] argsthrows InterruptedException,
      IOException {
    ProcessBuilder pb = new ProcessBuilder("cmd""/C""dir""C:\\Program Files\\Java");
    Process p = pb.start();

    BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
    Catcher c = new Catcher(br);
    c.start();

    p.waitFor();
    p.destroy();
    
    System.out.println(c.out.toString());
  }
}

class Catcher extends Thread {
  Reader in;
  StringWriter out = new StringWriter();
  public Catcher(Reader in) {
    this.in = in;
  }

  public void run() {
    int c;
    try {
      while ((c = in.read()) != -1) {
        out.write((char)c);
      }
    catch (IOException e) {
      e.printStackTrace();
    }

  }

}

コマンド プロンプト

C:\JavaMaster\bin>java -cp . samples.process.ProcessExecuteSample 
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は 8083-0BB0 です

 C:\Program Files\Java のディレクトリ

2005/12/25  20:13    <DIR>          .
2005/12/25  20:13    <DIR>          ..
2005/12/18  11:38    <DIR>          j2re1.4.2_10
2005/11/03  12:54    <DIR>          jdk1.5.0_05
2005/12/25  20:11    <DIR>          jdk1.5.0_06
2005/11/01  15:17    <DIR>          jre1.5.0_05
2005/12/25  20:13    <DIR>          jre1.5.0_06
               0 個のファイル                   0 バイト
               7 個のディレクトリ   2,531,590,144 バイトの空き領域

外部プログラムを呼び出すことについて

他の言語に対するJava言語の大きな特徴は「マルチプラットフォーム」、 つまりJava言語だけを使ってプログラムを書けば、 Javaバーチャルマシンが環境の違いを吸収してくれるので、 ハードウェアやOSの違いを気にせずに、 同じ実行結果を得ることができるという点です。 この性質を、「WORA」(Write Once, Run Anywhere)と呼びます。

ところが、このサンプルのように、外部のプログラムに依存するような Javaプログラムを書くと、特定のOSでしか動作しないJavaプログラムと なってしまい、WORAではなくなってしまいます。

しかし、現実の開発においては、既存のソフトウェアを流用して開発工数を削減したり、 Javaでは実現できない機能を実行したりするために、Java以外の言語で作られた 外部プログラムをJavaから呼び出す必要がある場合があります。 そのような場合に限り、プロセスを使って、 外部プログラムの呼び出しを使うことをお勧めします。

ディスクの空き容量取得について

この例では、Windowsのdirというコマンドを実行しています。 Javaではファイルシステムの残り容量を取得する方法がありませんので、 このような方法にて、残り容量を取得するしかありません。

Java 6のFileクラス では、ディスクの空き容量を取得するメソッドが追加されるようです。