JavaでOSのコマンドを実行したい時は

Javaでバッチ開発をしていると、OSのコマンドを使いたくなるシーンがあります。例えば、以下のような場合などです。

  • ls コマンドで対象ディレクトリのファイル一覧を取得したい
  • ping コマンドで、通信先サーバの状況確認をしたい


そのような時に用いられるのが「java.lang.Runtime」というクラスで、Javaとその実行環境との橋渡しをする役目を持っています。基本的な使い方としては、以下のようになります。

  1. Runtimeインスタンスは「Runtime.getRuntime」メソッドで取得
  2. 取得したRuntimeインスタンスの「exec」メソッドを実行
public class Command {
    public static void main(String[] args) {
        try {
            Runtime runtime = Runtime.getRuntime();
            runtime.exec("ls");
        } catch (IOException ex) {
        }
    }
}


さらに、実行した結果が欲しい場合は、「java.lang.Process」というクラスを利用します。というより、Runtimeインスタンスの「exec」メソッドの戻り値は、この「Process」クラスになっています。

  1. execメソッドの戻り値の「Process」クラスを取得
  2. 「Process」クラスのメソッドを使って内容などを取得


内容を取得する場合は、「getInputStream」メソッドを使用します。

public static void main(String[] args) {
    try {
        Runtime runtime = Runtime.getRuntime();
        Process p = runtime.exec("ls");
        InputStream is = p.getInputStream();
        // InputStreamさえ得られれば、後は必要に応じて内容を取得すればよい。
        // 以下、省略
    } catch (IOException ex) {
    }
}


終了コードのみで問題ない場合は、「waitFor」メソッドを使用します。

public static void main(String[] args) {
    try {
        Runtime runtime = Runtime.getRuntime();
        Process p = runtime.exec("ping 192.168.0.1");
        return p.waitFor();
    } catch (IOException ex) {
    }
}