JavaのProcessBuilderを使ってバッチファイルを実行する方法【初心者向け】

初心者向けにProcessBuilderを使う方法について解説しています。ProcessBuilderを使うと外部プログラムを実行することができます。実行の流れと基本の書き方について、サンプルプログラムを見ながら学習しましょう。

TechAcademyマガジンは受講者数No.1のオンラインプログラミングスクールTechAcademy [テックアカデミー]が運営。初心者向けに解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。

ProcessBuilderを使う方法について解説します。

実際にプログラムを書いて説明しているので、ぜひ理解しておきましょう。

 

なお本記事は、TechAcademyのJava講座の内容をもとに作成しています。

 

田島悠介

今回は、Javaに関する内容だね!

大石ゆかり

どういう内容でしょうか?

田島悠介

ProcessBuilderを使う方法について詳しく説明していくね!

大石ゆかり

お願いします!

目次

ProcessBuilderとは

「ProcessBuilder」とは、Javaから外部プログラムを実行するために使用するクラスです。

外部プログラムは、例えばWindowsであれば拡張子.bat、.cmdなどのバッチプログラム、MacやLinuxなどであればシェルスクリプトなどのことを指しています。

旧バージョンのJava(〜JDK1.4)では「Runtime」というクラスがその役割を担っていましたが、現在はそれより新しいクラスである「ProcessBuilder」を使うのがよりよい作法とされています。

 

[PR] Javaプログラミングで挫折しない学習方法を動画で公開中

JavaのProcessBuilderを使ってバッチファイルを実行する方法

「ProcessBuilder」を使って外部プログラムを実行するには、次の手順で行います。

  1. 実行する外部プログラムを指定してProcessBuilderインスタンスを生成する
    ProceddBuilderインスタンスを作成するには以下のように記述します

    ProcessBuilder ProcessBuilderの変数 = new ProcessBuilder(String... command);

    ProcessBuilderに渡す引数には起動するプログラム名とプログラムに渡す引数を設定してあげます。

  2. プロセスを開始する
    1でProcessBuilderインスタンスが作成できたら次はプロセスを開始していきます。
    開始するには以下のように記述します。

    Process Processの変数 = ProcessBuilderの変数.start();

    1で設定したプログラムを起動し、そこに1で設定した引数を渡してあげます。

  3. 結果を受け取る

    2でプロセスを起動させたら最後にその結果を受け取ります。
    受け取るには以下のように記述します

    try (BufferedReader 変数 = new BufferedReader(new InputStreamReader(Processの変数.getInputStream()))) {
      String 文字列;
      while ((String 文字列 =変数.readLine()) != null) {
        処理;
      }
    }

    2で作成したProcessの変数からgetInputStreamメソッドを使うことでInputStreamオブジェクトを取得することができます。そこからInputStreamReaderクラスとBufferReaderクラスを使うことでプロセスを実行した結果を受け取ることができます。

サンプルプログラムで、上記の手順に対応するコードを確認してみましょう。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.nio.charset.Charset;

public class ProcessExecutor {
    public static void main(String[] args) throws Exception {
        // 実行する外部プログラムを指定してProcessBuilderインスタンスを生成する
        // Macの場合はこちら
        ProcessBuilder p = new ProcessBuilder("sh", "-c", "echo 'Hello!'");
          // Windowsの場合はこちら
//        ProcessBuilder p = new ProcessBuilder("cmd", "/c", "echo", "Hello!");
        p.redirectErrorStream(true);

        // プロセスを開始する
        Process process = p.start();

        // 結果を受け取る
        try (BufferedReader r = new BufferedReader(new InputStreamReader(process.getInputStream(), Charset.defaultCharset()))) {
            String line;
            while ((line = r.readLine()) != null) {
                System.out.println(line);
            }
        }
        int result = process.exitValue();
        System.out.printf("result=%d%n", result);
    }
}

実行すると次の内容が出力されます。

実行する外部プログラムを変更してみたり、出力内容を修正したりしていろいろ試してみましょう。

Hello!
result=0

 

監修してくれたメンター

青柳哲夫

独立系SIerやベンチャーを経て、現在はフリーランスエンジニアとして活動しています。
PHPやJava・Rubyでの業務系Webアプリケーション開発が得意です。
TechAcademyではJavaコース・ブロックチェーンコースを担当しています。

 

大石ゆかり

内容分かりやすくて良かったです!

田島悠介

ゆかりちゃんも分からないことがあったら質問してね!

大石ゆかり

分かりました。ありがとうございます!

また、オンラインのプログラミングスクールTechAcademyでは、Java講座を開催しています。

JavaやServletの技術を使ってWebアプリケーションの開発を学ぶことができます。

現役エンジニアがパーソナルメンターとして受講生に1人ずつつき、マンツーマンのメンタリングで学習をサポートし、習得することが可能です。

また、現役エンジニアから学べる無料体験も実施しているので、ぜひ参加してみてください。