モジュール java.base
パッケージ java.lang

クラスProcessBuilder

java.lang.Object
java.lang.ProcessBuilder

public final class ProcessBuilder extends Object
このクラスは、オペレーティング・システムのプロセスの作成に使用されます。

ProcessBuilderインスタンスは、プロセス属性のコレクションを管理します。 start()メソッドはそれらの属性を使って新しいProcessインスタンスを作成します。 同じインスタンスからstart()メソッドを繰返し呼び出して、同一の属性または関連する属性を持つ新規サブプロセスを作成できます。

startPipelineメソッドを起動して、各プロセスの出力を次のプロセスに直接送信する新しいプロセスのパイプラインを作成できます。 各プロセスには、それぞれのProcessBuilderの属性があります。

各プロセス・ビルダーは、次のプロセス属性を管理します。

  • コマンド。呼び出される外部プログラム・ファイルと、その引数(存在する場合)を示す文字列のリストです。 どの文字列リストが有効なオペレーティング・システム・コマンドを表すかは、システムに応じて異なります。 たとえば、概念上の引数がリストの要素となるのが一般的ですが、プログラムがコマンド行文字列自体をトークン化することが要求されるオペレーティング・システムがあります。このようなシステムのJava実装では、正確に2つの要素を含むコマンドが必要になる場合があります。
  • 環境。環境は変数からへのシステム依存のマッピングです。 初期値は現在のプロセスの環境のコピーです(System.getenv()を参照)。
  • 作業ディレクトリ デフォルト値は、現在のプロセスの現在の作業ディレクトリです。通常、このディレクトリはシステム・プロパティuser.dirで名前が付けられたディレクトリです。
  • 標準入力の入力元 デフォルトでは、サブプロセスはパイプから入力を読み取ります。 Javaコード内でこのパイプにアクセスするには、Process.getOutputStream()から返される出力ストリームを使用します。 ただし標準入力は、redirectInputを使って別の入力元にリダイレクトできます。 この場合、Process.getOutputStream()から次のようなヌル出力ストリームが返されます。
    • writeメソッドは常にIOExceptionをスローする
    • closeメソッドは何も行わない
  • 標準出力標準エラーの出力先 デフォルトでは、サブプロセスは標準出力と標準エラーをパイプに書き込みます。 Javaコード内でこれらのパイプにアクセスするには、Process.getInputStream()およびProcess.getErrorStream()から返される入力ストリームを使用します。 ただし標準出力や標準エラーは、redirectOutputredirectErrorを使って他の出力先にリダイレクトできます。 この場合、Process.getInputStream()またはProcess.getErrorStream()、あるいはその両方から、次のようなヌル入力ストリームが返されます。
    • readメソッドは常に-1を返す
    • availableメソッドは常に0を返す
    • closeメソッドは何も行わない
  • redirectErrorStreamプロパティ。 初期状態では、このプロパティはfalseです。つまり、サブプロセスの標準出力とエラー出力は、2つの独立したストリームに送信されます。これらの出力にはProcess.getInputStream()メソッドとProcess.getErrorStream()メソッドを使ってアクセスできます。

    値がtrueに設定された場合:

    • 標準エラーが標準出力にマージされ、両者が常に同じ出力先に送信される(この場合、エラー・メッセージと対応する出力との相関関係が把握しやすくなる)
    • 標準エラーと標準出力の共通の出力先をリダイレクトするには、redirectOutputを使用する
    • サブプロセスの作成時に、redirectErrorメソッドで設定されたリダイレクトは無視される
    • Process.getErrorStream()から返されるストリームは常にヌル入力ストリームとなる

プロセス・ビルダーの属性を変更すると、属性を変更したオブジェクトのstart()メソッドでそれ以降起動されるプロセスに影響がありますが、それ以前に起動されたプロセスやJavaプロセス自体には影響ありません。

ほとんどのエラー・チェックはstart()メソッドで実行されます。 start()が失敗するように、オブジェクトの状態を変更できます。 たとえば、コマンド属性を空のリストに設定すると、start()が呼び出されない限り、例外はスローされません。

このクラスは同期化されません。 複数のスレッドがProcessBuilderインスタンスに並行してアクセスし、少なくとも1つのスレッドが構造的に1つの属性を変更した場合、変更された属性は外部で同期化されなければいけません

デフォルトの作業ディレクトリと環境を使用する新しいプロセスを起動するのは、次に示すように容易です。

 
 Process p = new ProcessBuilder("myCommand", "myArg").start();
 

変更された作業ディレクトリと環境を使ってプロセスを起動し、標準出力と標準エラーがログ・ファイルに追加されるようにリダイレクトする例を、次に示します。

 
 ProcessBuilder pb =
   new ProcessBuilder("myCommand", "myArg1", "myArg2");
 Map<String, String> env = pb.environment();
 env.put("VAR1", "myValue");
 env.remove("OTHERVAR");
 env.put("VAR2", env.get("VAR1") + "suffix");
 pb.directory(new File("myDir"));
 File log = new File("log");
 pb.redirectErrorStream(true);
 pb.redirectOutput(Redirect.appendTo(log));
 Process p = pb.start();
 assert pb.redirectInput() == Redirect.PIPE;
 assert pb.redirectOutput().file() == log;
 assert p.getInputStream().read() == -1;
 

環境変数の明示的セットを持つプロセスを起動するには、まずMap.clear()を呼び出してから、環境変数を追加します。

ほかで指定がない場合、null引数をコンストラクタまたはこのクラスのメソッドへ渡すと、NullPointerExceptionがスローされます。

導入されたバージョン:
1.5