public final class ProcessBuilder extends Object
各 ProcessBuilder
インスタンスは、プロセス属性のコレクションを管理します。start()
メソッドはそれらの属性を使って新しい Process
インスタンスを作成します。同じインスタンスから start()
メソッドを繰り返し呼び出して、同一の属性または関連する属性を持つ新規サブプロセスを作成できます。
各プロセスビルダーは、次のプロセス属性を管理します。
System.getenv()
を参照)。
user.dir
で名前が付けられたディレクトリです。
Process.getOutputStream()
から返される出力ストリームを使用します。ただし標準入力は、redirectInput
を使って別の入力元にリダイレクトできます。この場合、Process.getOutputStream()
から次のような null 出力ストリームが返されます。
Process.getInputStream()
および Process.getErrorStream()
から返される入力ストリームを使用します。ただし標準出力や標準エラーは、redirectOutput
や redirectError
を使ってほかの出力先にリダイレクトできます。この場合、Process.getInputStream()
または Process.getErrorStream()
、あるいはその両方から、次のような null 入力ストリームが返されます。
false
です。つまり、サブプロセスの標準出力とエラー出力は、2 つの独立したストリームに送信されます。これらの出力には Process.getInputStream()
メソッドと Process.getErrorStream()
メソッドを使ってアクセスできます。
値が true
に設定された場合:
redirectOutput
を使用する
redirectError
メソッドで設定されたリダイレクトは無視される
Process.getErrorStream()
から返されるストリームは常に null 入力ストリーム となる
プロセスビルダーの属性を変更すると、属性を変更したオブジェクトの 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()
を呼び出してから、環境変数を追加します。
修飾子と型 | クラスと説明 |
---|---|
static class |
ProcessBuilder.Redirect
サブプロセスの入力元またはサブプロセスの出力先を表します。
|
コンストラクタと説明 |
---|
ProcessBuilder(List<String> command)
指定されたオペレーティングシステムプログラムと引数を持つプロセスビルダーを構築します。
|
ProcessBuilder(String... command)
指定されたオペレーティングシステムプログラムと引数を持つプロセスビルダーを構築します。
|
修飾子と型 | メソッドと説明 |
---|---|
List<String> |
command()
プロセスビルダーのオペレーティングシステムプログラムと引数を返します。
|
ProcessBuilder |
command(List<String> command)
このプロセスビルダーのオペレーティングシステムプログラムと引数を設定します。
|
ProcessBuilder |
command(String... command)
このプロセスビルダーのオペレーティングシステムプログラムと引数を設定します。
|
File |
directory()
このプロセスビルダーの作業ディレクトリを返します。
|
ProcessBuilder |
directory(File directory)
このプロセスビルダーの作業ディレクトリを設定します。
|
Map<String,String> |
environment()
このプロセスビルダーの環境の文字列マップのビューを返します。
|
ProcessBuilder |
inheritIO()
サブプロセスの標準入出力の入力元と出力先を、現在の Java プロセスと同じものに設定します。
|
ProcessBuilder.Redirect |
redirectError()
このプロセスビルダーの標準エラー出力先を返します。
|
ProcessBuilder |
redirectError(File file)
このプロセスビルダーの標準エラー出力先をファイルに設定します。
|
ProcessBuilder |
redirectError(ProcessBuilder.Redirect destination)
このプロセスビルダーの標準エラー出力先を設定します。
|
boolean |
redirectErrorStream()
このプロセスビルダーが標準エラーと標準出力をマージするかどうかを判定します。
|
ProcessBuilder |
redirectErrorStream(boolean redirectErrorStream)
このプロセスビルダーの
redirectErrorStream プロパティーを設定します。 |
ProcessBuilder.Redirect |
redirectInput()
このプロセスビルダーの標準入力元を返します。
|
ProcessBuilder |
redirectInput(File file)
このプロセスビルダーの標準入力元をファイルに設定します。
|
ProcessBuilder |
redirectInput(ProcessBuilder.Redirect source)
このプロセスビルダーの標準入力元を設定します。
|
ProcessBuilder.Redirect |
redirectOutput()
このプロセスビルダーの標準出力先を返します。
|
ProcessBuilder |
redirectOutput(File file)
このプロセスビルダーの標準出力先をファイルに設定します。
|
ProcessBuilder |
redirectOutput(ProcessBuilder.Redirect destination)
このプロセスビルダーの標準出力先を設定します。
|
Process |
start()
このプロセスビルダーの属性を使って新規プロセスを起動します。
|
public ProcessBuilder(List<String> command)
command
リストのコピーを作成しません。以降のリストの更新は、プロセスビルダーの状態に反映されます。command
が有効なオペレーティングシステムコマンドに対応するかどうかはチェックされません。command
- プログラムとプログラムの引数を含むリストNullPointerException
- 引数が null の場合public ProcessBuilder(String... command)
command
配列と同じ文字列を含む文字列リストに、プロセスビルダーのコマンドを同じ順序で設定する簡易コンストラクタです。command
が有効なオペレーティングシステムコマンドに対応するかどうかはチェックされません。command
- プログラムとプログラムの引数を含む文字列配列public ProcessBuilder command(List<String> command)
command
リストのコピーを作成しません。以降のリストの更新は、プロセスビルダーの状態に反映されます。command
が有効なオペレーティングシステムコマンドに対応するかどうかはチェックされません。command
- プログラムとプログラムの引数を含むリストNullPointerException
- 引数が null の場合public ProcessBuilder command(String... command)
command
配列と同じ文字列を含む文字列リストにコマンドを同じ順序で設定する簡易メソッドです。command
が有効なオペレーティングシステムコマンドに対応するかどうかはチェックされません。command
- プログラムとプログラムの引数を含む文字列配列public List<String> command()
public Map<String,String> environment()
System.getenv()
を参照)。これ以降、このオブジェクトの start()
メソッドで起動されたサブプロセスは、このマップを環境として使用します。
返されたオブジェクトは、通常の Map
オペレーションを使って変更できます。これらの変更は、start()
メソッドを使って起動されたサブプロセスで可視です。2 つの ProcessBuilder
インスタンスは常に独立したプロセス環境を持っています。このため、返されたマップは、ほかの ProcessBuilder
インスタンスや、System.getenv
で返された値に反映されることはありません。
システムが環境変数をサポートしていない場合は、空のマップが返されます。
返されたマップは、null のキーや値を許容しません。null のキーや値を挿入したり、これらがあるか照会すると、NullPointerException
がスローされます。String
以外の型のキーや値が存在するかどうかのクエリーを試みると、ClassCastException
がスローされます。
返されたマップの動作はシステムに依存します。環境変数の変更を許可しないシステムがあれば、特定の変数名や値が禁止されるシステムもあります。この理由から、オペレーティングシステムで変更が許可されていない場合にマップを変更しようとすると、UnsupportedOperationException
や IllegalArgumentException
で失敗する可能性があります。
環境変数名と環境変数の値の外部形式はシステムに依存するので、環境変数名と環境変数の値と Java の Unicode 文字列との間に 1 対 1 のマッピング関係がない可能性があります。その場合でも、Java コードで変更されていない環境変数が、サブプロセスでも変更されていないネイティブな表現を持つようにマップは実装されます。
返されたマップとそのコレクションビューは、Object.equals(java.lang.Object)
メソッドと Object.hashCode()
メソッドの汎用規約に従わない可能性があります。
返されたマップは、一般にすべてのプラットフォームで大文字と小文字を区別します。
セキュリティーマネージャーが存在する場合は、その checkPermission
メソッドが RuntimePermission
("getenv.*")
アクセス権で呼び出されます。これにより、SecurityException
がスローされる可能性があります。
Java サブプロセスに情報を渡す場合、一般的に環境変数よりもシステムプロパティーが推奨されます。
SecurityException
- セキュリティーマネージャーが存在し、その checkPermission
メソッドがプロセス環境へのアクセスを許可しない場合Runtime.exec(String[],String[],java.io.File)
, System.getenv()
public File directory()
start()
メソッドで起動されたサブプロセスは、このディレクトリを作業ディレクトリとして使用します。戻り値は、null
の可能性があります。これは、現在の Java プロセスの作業ディレクトリ (通常は user.dir
システムプロパティーで指定されたディレクトリ) を子プロセスの作業ディレクトリとして使用することを意味します。public ProcessBuilder directory(File directory)
start()
メソッドで起動されたサブプロセスは、このディレクトリを作業ディレクトリとして使用します。引数は、null
の可能性があります。これは、現在の Java プロセスの作業ディレクトリ (通常は user.dir
システムプロパティーで指定されたディレクトリ) を子プロセスの作業ディレクトリとして使用することを意味します。directory
- 新規作業ディレクトリpublic ProcessBuilder redirectInput(ProcessBuilder.Redirect source)
start()
メソッドで起動されたサブプロセスは、標準入力をこの入力元から取得します。
source が Redirect.PIPE
(初期値) の場合、Process.getOutputStream()
から返される出力ストリームを使ってサブプロセスの標準入力への書き込みを行えます。source をその他の値に設定した場合、Process.getOutputStream()
から null 出力ストリームが返されます。
source
- 新しい標準入力元IllegalArgumentException
- リダイレクトがデータの有効な出力先に対応していない場合、つまりその型が WRITE
または APPEND
の場合public ProcessBuilder redirectOutput(ProcessBuilder.Redirect destination)
start()
メソッドで起動されたサブプロセスは、標準出力をこの出力先に送信します。
destination が Redirect.PIPE
(初期値) の場合、Process.getInputStream()
から返される入力ストリームを使ってサブプロセスの標準出力の読み取りを行えます。destination をその他の値に設定した場合、Process.getInputStream()
から null 入力ストリームが返されます。
destination
- 新しい標準出力先IllegalArgumentException
- リダイレクトがデータの有効な出力先に対応していない場合、つまり次の型を持つ場合: READ
public ProcessBuilder redirectError(ProcessBuilder.Redirect destination)
start()
メソッドで起動されたサブプロセスは、標準エラーをこの出力先に送信します。
destination が Redirect.PIPE
(初期値) の場合、Process.getErrorStream()
から返される入力ストリームを使ってサブプロセスのエラー出力の読み取りを行えます。destination をその他の値に設定した場合、Process.getErrorStream()
から null 入力ストリームが返されます。
redirectErrorStream
属性が true
に設定されていた場合、このメソッドで設定されたリダイレクトは何の効果も持ちません。
destination
- 新しい標準エラー出力先IllegalArgumentException
- リダイレクトがデータの有効な出力先に対応していない場合、つまり次の型を持つ場合: READ
public ProcessBuilder redirectInput(File file)
これは、簡易メソッドです。redirectInput(file)
の形式で呼び出した場合、呼び出し redirectInput
(Redirect.from(file))
とまったく同じ動作になります。
file
- 新しい標準入力元public ProcessBuilder redirectOutput(File file)
これは、簡易メソッドです。redirectOutput(file)
の形式で呼び出した場合、呼び出し redirectOutput
(Redirect.to(file))
とまったく同じ動作になります。
file
- 新しい標準出力先public ProcessBuilder redirectError(File file)
これは、簡易メソッドです。redirectError(file)
の形式で呼び出した場合、呼び出し redirectError
(Redirect.to(file))
とまったく同じ動作になります。
file
- 新しい標準エラー出力先public ProcessBuilder.Redirect redirectInput()
start()
メソッドで起動されたサブプロセスは、標準入力をこの入力元から取得します。初期値は Redirect.PIPE
です。public ProcessBuilder.Redirect redirectOutput()
start()
メソッドで起動されたサブプロセスは、標準出力をこの出力先にリダイレクトします。初期値は Redirect.PIPE
です。public ProcessBuilder.Redirect redirectError()
start()
メソッドで起動されたサブプロセスは、標準エラーをこの出力先にリダイレクトします。初期値は Redirect.PIPE
です。public ProcessBuilder inheritIO()
これは、簡易メソッドです。次の形式の呼び出しは、
pb.inheritIO()
次の呼び出しと正確に同じ動作になります。
pb.redirectInput(Redirect.INHERIT)
.redirectOutput(Redirect.INHERIT)
.redirectError(Redirect.INHERIT)
この動作は、ほとんどのオペレーティングシステムコマンドインタプリタや標準 C ライブラリ関数 system()
と同等のものになります。public boolean redirectErrorStream()
このプロパティーが true
の場合、このオブジェクトの start()
メソッドでそれ以降起動されたサブプロセスにより生成されるエラー出力は、標準出力とマージされます。これにより、Process.getInputStream()
メソッドを使って、エラー出力と標準出力の両方を読み取ることができます。マージにより、エラーメッセージと対応する出力との相関を示すのが容易になります。初期値は false
です。
redirectErrorStream
プロパティーpublic ProcessBuilder redirectErrorStream(boolean redirectErrorStream)
redirectErrorStream
プロパティーを設定します。
このプロパティーが true
の場合、このオブジェクトの start()
メソッドでそれ以降起動されたサブプロセスにより生成されるエラー出力は、標準出力とマージされます。これにより、Process.getInputStream()
メソッドを使って、エラー出力と標準出力の両方を読み取ることができます。マージにより、エラーメッセージと対応する出力との相関を示すのが容易になります。初期値は false
です。
redirectErrorStream
- 新しいプロパティーの値public Process start() throws IOException
新しいプロセスは、directory()
で与えられる作業ディレクトリ内で、environment()
で与えられるプロセス環境の下、command()
で与えられるコマンドと引数を呼び出します。
このメソッドは、コマンドが有効な オペレーティングシステムコマンドであることをチェックします。どのコマンドが有効かはシステム依存ですが、コマンドは少なくとも null 以外の文字列の空でないリストである必要があります。
一部のオペレーティングシステムでは、プロセスを起動するために最小限のシステム依存環境変数のセットが必要となる可能性があります。このため、プロセスビルダーの environment()
に含まれていない追加の環境変数設定をサブプロセスが継承する可能性があります。
セキュリティーマネージャーが存在する場合はその checkExec
メソッドが呼び出されますが、その際、このオブジェクトの command
配列の最初のコンポーネントが引数として指定されます。これにより、SecurityException
がスローされる可能性があります。
オペレーティングシステムプロセスの起動はきわめてシステムに依存します。発生する可能性がある不具合は次のとおりです。
以上のケースでは、例外がスローされます。例外の正確な特性はシステムに依存しますが、これは常に IOException
のサブクラスになります。
このプロセスビルダーへの以降の変更は、返された Process
に影響を及ぼしません。
Process
オブジェクトNullPointerException
- コマンドリストの要素が null の場合IndexOutOfBoundsException
- コマンドが空 (サイズが 0
) のリストの場合SecurityException
- セキュリティーマネージャーが存在していて、
checkExec
メソッドがサブプロセスの作成を許可しない場合、または
checkRead
メソッドがファイルからの読み取りアクセスを拒否する場合、または
checkWrite
メソッドがファイルへの書き込みアクセスを拒否する場合
IOException
- 入出力エラーが発生した場合Runtime.exec(String[], String[], java.io.File)
バグまたは機能を送信
詳細な API リファレンスおよび開発者ドキュメントについては、Java SE のドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.