クラスProcess
Processは、ProcessBuilder.startおよびRuntime.execによって開始されたネイティブ・プロセスの制御を提供します。 このクラスは、プロセスからの入力の実行、プロセスへの出力の実行、プロセスの完了の待機、プロセスの終了ステータスの確認、およびプロセスの(kill)の破棄を行うためのメソッドを提供します。 ProcessBuilder.start()メソッドやRuntime.execメソッドはネイティブのプロセスを作成し、Processのサブクラスのインスタンスを返しますが、これを使えば、そのプロセスを制御したり情報を取得したりできます。
たとえば、ネイティブなウィンドウ処理プロセス、デーモン・プロセス、Microsoft Windows環境でのWin16/DOSプロセス、あるいはシェル・スクリプトといったプロセスです。
デフォルトでは、作成されたプロセスには独自の端末またはコンソールがありません。 その標準入出力(つまり標準入力、標準出力、標準エラー)の処理はすべて親プロセスにリダイレクトされますが、それらの情報にアクセスするには、メソッドgetOutputStream()、getInputStream()、およびgetErrorStream()を使って取得されるストリームを使用します。 文字および行のI/Oストリームは、メソッドoutputWriter()、outputWriter(Charset)、inputReader()、inputReader(Charset)、errorReader()およびerrorReader(Charset)を使用して記述および読み取ることができます。 親プロセスは、これらのストリームを使用して、プロセスへの入力およびプロセスからの出力を取得します。 一部のネイティブ・プラットフォームでは、標準入出力ストリームのバッファ・サイズが制限されているため、入力ストリームの迅速な書込みまたはプロセスの出力ストリームの読取りに失敗すると、プロセスがブロックされるか、デッドロックが発生する可能性があります。
必要に応じて、ProcessBuilderクラスのメソッドを使用する「プロセスI/Oもリダイレクトできます」。
Processオブジェクトへの参照がなくなると、プロセスは強制終了されませんが、プロセスは非同期的に実行し続けます。
Processオブジェクトによって表されるプロセスが、Processオブジェクトを所有するJavaプロセスに対して非同期または同時に実行される必要はありません。
1.5以降でProcessを作成するための推奨の方法は、ProcessBuilder.start()です。
プロセスのサブクラスは、プロセスの「プロセスID」、「プロセスに関する情報」、「直接の子供たち」および「直接の子どもとその子孫の子孫」を含む完全に機能するプロセスを提供するために、onExit()およびtoHandle()メソッドをオーバーライドする必要があります。 基礎となるプロセスまたはProcessHandleに委任することは、通常、最も簡単で最も効率的です。
- 導入されたバージョン:
- 1.0
-
コンストラクタのサマリー
コンストラクタ -
メソッドのサマリー
修飾子と型メソッド説明children()プロセスの直接の子のスナップショットを返します。プロセスの子孫のスナップショットを返します。abstract voiddestroy()プロセスを強制終了します。プロセスを強制的に停止します。final BufferedReaderプロセスの標準エラーに接続されたBufferedReaderを返します。final BufferedReadererrorReader(Charset charset) Charsetを使用してこのプロセスの標準エラーに接続されたBufferedReaderを返します。abstract intプロセスの終了値を返します。abstract InputStreamプロセスのエラー出力に接続された入力ストリームを返します。abstract InputStreamプロセスの通常の出力に接続された入力ストリームを返します。abstract OutputStreamプロセスの通常入力に接続された出力ストリームを返します。info()プロセスに関する情報のスナップショットを返します。final BufferedReaderプロセスの標準出力に接続されたBufferedReaderを返します。final BufferedReaderinputReader(Charset charset) Charsetを使用してこのプロセスの標準出力に接続されたBufferedReaderを返します。booleanisAlive()このProcessによって表されるプロセスが動作しているかどうかをテストします。onExit()プロセスの終了のCompletableFuture<Process>を返します。final BufferedWriterネイティブ・エンコーディングを使用して、プロセスの通常入力に接続されたBufferedWriterを返します。final BufferedWriteroutputWriter(Charset charset) Charsetを使用してプロセスの通常入力に接続されたBufferedWriterを返します。longpid()プロセスのネイティブ・プロセスIDを返します。booleandestroy()の実装が通常プロセスを終了する場合はtrueを戻し、destroyの実装を強制的に戻してプロセスをすぐに終了する場合はfalseを戻します。toHandle()プロセスのProcessHandleを返します。abstract intwaitFor()必要な場合に、このProcessオブジェクトが表すプロセスが終了するまで現在のスレッドを待機させます。booleanこのProcessオブジェクトによって表されるプロセスが終了するか、指定された待機時間が経過するまで、必要に応じて現在のスレッドを待機させます。
-
コンストラクタの詳細
-
Process
public Process()Processのデフォルト・コンストラクタです。
-
-
メソッドの詳細
-
getOutputStream
public abstract OutputStream getOutputStream()プロセスの通常入力に接続された出力ストリームを返します。 ストリームへの出力は、このProcessオブジェクトが表すプロセスの標準入力に渡されます。プロセスの標準入力が
ProcessBuilder.redirectInputを使用してリダイレクトされた場合、このメソッドは「ヌル出力ストリーム」を返します。- APIのノート:
getOutputStream()とoutputWriter()またはoutputWriter(Charset)の両方に書き込む場合、OutputStreamに書込みする前にBufferedWriter.flushをコールする必要があります。- 実装上のノート:
- 実装にあたってのノート: 返される出力ストリームのバッファ処理をお薦めします。
- 戻り値:
- プロセスの通常の入力に接続された出力ストリーム
-
getInputStream
public abstract InputStream getInputStream()プロセスの通常の出力に接続された入力ストリームを返します。 ストリームは、このProcessオブジェクトが表すプロセスの標準出力から渡されたデータを取得します。プロセスの標準出力が
ProcessBuilder.redirectOutputを使用してリダイレクトされた場合、このメソッドは「ヌル入力ストリーム」を返します。それ以外の場合、プロセスの標準エラーが
ProcessBuilder.redirectErrorStreamを使用してリダイレクトされると、このメソッドによって返される入力ストリームは、マージされた標準出力とプロセスの標準エラーを受け取ります。- APIのノート:
getInputStream()およびinputReader()は細心の注意を払って使用してください。BufferedReaderには、入力ストリームからのバッファ入力がある場合があります。- 実装上のノート:
- 実装にあたってのノート: 返される入力ストリームのバッファ処理をお薦めします。
- 戻り値:
- プロセスの通常の出力に接続された入力ストリーム
-
getErrorStream
public abstract InputStream getErrorStream()プロセスのエラー出力に接続された入力ストリームを返します。 ストリームは、このProcessオブジェクトが表すプロセスのエラー出力から渡されたデータを取得します。ProcessBuilder.redirectErrorまたはProcessBuilder.redirectErrorStreamを使用してプロセスの標準エラーがリダイレクトされた場合、このメソッドは「ヌル入力ストリーム」を返します。- APIのノート:
getErrorStream()およびerrorReader()は細心の注意を払って使用してください。BufferedReaderは、エラー・ストリームからの入力をバッファリングしている可能性があります。- 実装上のノート:
- 実装にあたってのノート: 返される入力ストリームのバッファ処理をお薦めします。
- 戻り値:
- プロセスのエラー出力に接続された入力ストリーム
-
inputReader
public final BufferedReader inputReader()プロセスの標準出力に接続されたBufferedReaderを返します。 ネイティブ・エンコーディングのCharsetは、標準出力からの文字、行またはストリーム行の読取りに使用されます。このメソッドは、
native.encodingシステム・プロパティで指定されたCharsetを使用してinputReader(Charset)に委任します。native.encodingが有効な文字セット名でない場合、またはサポートされていない場合は、Charset.defaultCharset()が使用されます。- 戻り値:
native.encodingを使用する場合はBufferedReader、サポートされていない場合はCharset.defaultCharset()- 導入されたバージョン:
- 17
-
inputReader
public final BufferedReader inputReader(Charset charset) Charsetを使用してこのプロセスの標準出力に接続されたBufferedReaderを返します。BufferedReaderは、標準出力の文字、行またはストリーム行の読取りに使用できます。文字は、このプロセス
getInputStream()からバイトを読み取ってデコードするInputStreamReaderによって読み取られます。 バイトはcharsetを使用して文字にデコードされ、不正な形式の入力文字およびマップ不能文字のシーケンスは文字セットのデフォルト置換に置き換えられます。BufferedReaderは、InputStreamReaderから文字を読み込んでバッファします。このメソッドへの最初のコールによって、同じ
charsetで再度コールされた場合、同じBufferedReaderが返されます。 このメソッドを別のcharsetで再度コールするとエラーになります。プロセスの標準出力が
ProcessBuilder.redirectOutputを使用してリダイレクトされた場合、InputStreamReaderは「ヌル入力ストリーム」から読み取られます。それ以外の場合、プロセスの標準エラーが
ProcessBuilder.redirectErrorStreamを使用してリダイレクトされた場合、このメソッドによって返された入力リーダーは、マージされた標準出力とプロセスの標準エラーを受け取ります。- APIのノート:
getInputStream()とinputReader(Charset)の両方を使用すると、バッファ・リーダーが入力ストリームから前方に読み取られるため、予期しない動作が発生します。プロセスが終了し、標準入力がリダイレクトされていない場合、基礎となるストリームから使用可能なバイトの読取りはベスト・エフォート・ベースであり、予測不能になる可能性があります。
- パラメータ:
charset- バイトを文字にデコードするために使用されるCharset- 戻り値:
charsetを使用したプロセスの標準出力の場合はBufferedReader- 例外:
NullPointerException-charsetがnullの場合IllegalStateException- 異なる文字セット引数を使用して複数回コールした場合- 導入されたバージョン:
- 17
-
errorReader
public final BufferedReader errorReader()プロセスの標準エラーに接続されたBufferedReaderを返します。 ネイティブ・エンコーディングのCharsetは、標準エラーからの文字、行またはストリーム行の読取りに使用されます。このメソッドは、
native.encodingシステム・プロパティで指定されたCharsetを使用してerrorReader(Charset)に委任します。native.encodingが有効な文字セット名でない場合、またはサポートされていない場合は、Charset.defaultCharset()が使用されます。- 戻り値:
native.encodingを使用する場合はBufferedReader、サポートされていない場合はCharset.defaultCharset()- 導入されたバージョン:
- 17
-
errorReader
public final BufferedReader errorReader(Charset charset) Charsetを使用してこのプロセスの標準エラーに接続されたBufferedReaderを返します。BufferedReaderを使用すると、標準エラーの文字、行またはストリーム行を読み取ることができます。文字は、このプロセス
getErrorStream()からバイトを読み取ってデコードするInputStreamReaderによって読み取られます。 バイトはcharsetを使用して文字にデコードされ、不正な形式の入力文字およびマップ不能文字のシーケンスは文字セットのデフォルト置換に置き換えられます。BufferedReaderは、InputStreamReaderから文字を読み込んでバッファします。このメソッドへの最初のコールによって、同じ
charsetで再度コールされた場合、同じBufferedReaderが返されます。 このメソッドを別のcharsetで再度コールするとエラーになります。プロセスの標準エラーが
ProcessBuilder.redirectErrorまたはProcessBuilder.redirectErrorStreamを使用してリダイレクトされた場合、InputStreamReaderは「ヌル入力ストリーム」から読み取られます。- APIのノート:
getErrorStream()とerrorReader(Charset)の両方を使用すると、バッファ・リーダーがエラー・ストリームから前方に読み取られるため、予期しない動作が発生します。プロセスが終了し、標準エラーがリダイレクトされない場合は、基礎となるストリームから使用可能なバイトの読取りがベスト・エフォート・ベースで予測できない可能性があります。
- パラメータ:
charset- バイトを文字にデコードするために使用されるCharset- 戻り値:
charsetを使用したプロセスの標準エラーの場合はBufferedReader- 例外:
NullPointerException-charsetがnullの場合IllegalStateException- 異なる文字セット引数を使用して複数回コールした場合- 導入されたバージョン:
- 17
-
outputWriter
public final BufferedWriter outputWriter()ネイティブ・エンコーディングを使用して、プロセスの通常入力に接続されたBufferedWriterを返します。 文字をバッファリングすることによって、文字、配列、または文字列を効率良く文字型出力ストリームに書き込みます。このメソッドは、
native.encodingシステム・プロパティで指定されたCharsetを使用してoutputWriter(Charset)に委任します。native.encodingが有効な文字セット名でない場合、またはサポートされていない場合は、Charset.defaultCharset()が使用されます。- 戻り値:
native.encodingシステム・プロパティの文字セットを使用したプロセスの標準入力に対するBufferedWriter- 導入されたバージョン:
- 17
-
outputWriter
public final BufferedWriter outputWriter(Charset charset) Charsetを使用してプロセスの通常入力に接続されたBufferedWriterを返します。 文字をバッファリングすることによって、文字、配列、または文字列を効率良く文字型出力ストリームに書き込みます。ライターによって書き込まれる文字は
OutputStreamWriterを使用してバイトにエンコードされ、CharsetはこのProcessによって表されるプロセスの標準入力に書き込まれます。 誤った形式の入力およびマップ不能文字シーケンスは、文字セットのデフォルト置換で置き換えられます。このメソッドへの最初のコールによって、同じ
charsetで再度コールされた場合、同じBufferedWriterが返されます。 このメソッドを別のcharsetで再度コールするとエラーになります。プロセスの標準入力が
ProcessBuilder.redirectInputを使用してリダイレクトされた場合、OutputStreamWriterは「ヌル出力ストリーム」に書き込みます。- APIのノート:
- BufferedWriterは、文字、文字の配列および文字列を書き込みます。
BufferedWriterをPrintWriterでラップすると、プリミティブやオブジェクトの効率的なバッファリングおよび書式設定、および行末の自動フラッシュがサポートされます。BufferedWriter.flush()メソッドをコールして、バッファ出力をプロセスにフラッシュします。getOutputStream()とoutputWriter()またはoutputWriter(Charset)の両方に書き込む場合、OutputStreamに書込みする前にBufferedWriter.flushをコールする必要があります。 - パラメータ:
charset- 文字をバイトにエンコードするCharset- 戻り値:
charsetを使用したプロセスの標準入力に対するBufferedWriter- 例外:
NullPointerException-charsetがnullの場合IllegalStateException- 異なる文字セット引数を使用して複数回コールした場合- 導入されたバージョン:
- 17
-
waitFor
public abstract int waitFor() throws InterruptedException必要な場合に、このProcessオブジェクトが表すプロセスが終了するまで現在のスレッドを待機させます。 このメソッドは、プロセスがすでに終了している場合はただちに戻ります。 プロセスがまだ終了していない場合は、プロセスが終了するまで呼び出しスレッドがブロックされます。- 戻り値:
- この
Processオブジェクトによって表されるプロセスの終了値。0は正常終了を示す。 - 例外:
InterruptedException- 現在のスレッドが待機中にほかのスレッドによって割り込まれた場合、待機を終了してInterruptedExceptionがスローされる。
-
waitFor
public boolean waitFor(long timeout, TimeUnit unit) throws InterruptedException このProcessオブジェクトによって表されるプロセスが終了するか、指定された待機時間が経過するまで、必要に応じて現在のスレッドを待機させます。プロセスがすでに終了している場合、このメソッドは値
trueを返します。 プロセスがまだ終了しておらず、タイムアウト値がゼロ以下の場合、このメソッドは値falseでただちに復帰します。このメソッドのデフォルト実装は、
exitValueをポーリングして、プロセスが終了したかどうかを確認します。 このクラスの具象実装では、このメソッドをより効率的な実装でオーバーライドすることを強くお薦めします。- パラメータ:
timeout- 待機する最長時間unit-timeout引数の時間単位- 戻り値:
- プロセスが終了した場合は
true、プロセスの終了前に待機時間が経過した場合はfalse。 - 例外:
InterruptedException- 待機中に現在のスレッドで割込みが発生した場合。NullPointerException- 単位がnullの場合- 導入されたバージョン:
- 1.8
-
exitValue
public abstract int exitValue()プロセスの終了値を返します。- 戻り値:
- この
Processオブジェクトによって表されるプロセスの終了値。0は正常終了を示す。 - 例外:
IllegalThreadStateException- このProcessオブジェクトによって表されるプロセスがまだ終了していない場合
-
destroy
public abstract void destroy()プロセスを強制終了します。 このProcessオブジェクトによって表されるプロセスが「正常終了」かどうかは、実装に依存します。 強制的なプロセス破棄は、プロセスの即時終了として定義されますが、通常終了では、プロセスは正常に停止できます。 プロセスが動作していない場合、アクションは実行されません。プロセスが終了すると、
onExit()のCompletableFutureはcompletedになります。 -
destroyForcibly
public Process destroyForcibly()プロセスを強制的に停止します。 このProcessオブジェクトで表されるプロセスは強制的に終了します。 強制的なプロセス破棄は、プロセスの即時終了として定義されますが、通常終了では、プロセスは正常に停止できます。 プロセスが動作していない場合、アクションは実行されません。プロセスが終了すると、
onExit()のCompletableFutureはcompletedになります。ProcessBuilder.start()およびRuntime.exec(java.lang.String)によって戻されたProcessオブジェクトに対してこのメソッドを呼び出すと、プロセスが強制的に終了します。- APIのノート:
- プロセスは即時に終了できません。つまり、
destroyForcibly()がコールされた後、isAlive()が短期間trueを返すことがあります。 このメソッドは、必要に応じてwaitFor()にチェーンされることがあります。 - 実装要件:
- このメソッドのデフォルト実装では、
destroy()を呼び出すため、プロセスが強制終了されない場合があります。 - 実装上のノート:
- このクラスの具象実装では、このメソッドを準拠した実装でオーバーライドすることを強くお薦めします。
- 戻り値:
- 強制破壊されたプロセスを表す
Processオブジェクト - 導入されたバージョン:
- 1.8
-
supportsNormalTermination
public boolean supportsNormalTermination()destroy()の実装が通常プロセスを終了する場合はtrueを戻し、destroyの実装を強制的に戻してプロセスをすぐに終了する場合はfalseを戻します。ProcessBuilder.start()およびRuntime.exec(java.lang.String)によって戻されるProcessオブジェクトに対してこのメソッドを呼び出すと、プラットフォームの実装に応じてtrueまたはfalseが返されます。- 実装要件:
- この実装は、
UnsupportedOperationExceptionのインスタンスをスローし、他のアクションは実行しません。 - 戻り値:
destroy()の実装で通常プロセスを終了する場合はtrue、そうでない場合はdestroy()によって強制的にプロセスが終了されます- 例外:
UnsupportedOperationException- Process実装がこの操作をサポートしていない場合- 導入されたバージョン:
- 9
-
isAlive
public boolean isAlive()このProcessによって表されるプロセスが動作しているかどうかをテストします。- 戻り値:
- この
Processオブジェクトによって表されるプロセスがまだ終了していない場合は、true。 - 導入されたバージョン:
- 1.8
-
pid
public long pid()プロセスのネイティブ・プロセスIDを返します。 ネイティブ・プロセスIDは、オペレーティング・システムがプロセスに割り当てる識別番号です。- 実装要件:
- このメソッドの実装は、プロセスIDを:
toHandle().pid()。 - 戻り値:
- プロセスのネイティブ・プロセスID
- 例外:
UnsupportedOperationException- Process実装がこの操作をサポートしていない場合- 導入されたバージョン:
- 9
-
onExit
public CompletableFuture<Process> onExit()プロセスの終了のCompletableFuture<Process>を返します。CompletableFutureは、プロセスの終了時に同期または非同期に実行できる依存ファンクションまたはアクションをトリガーする機能を提供します。 プロセスが終了すると、プロセスの終了ステータスに関係なく、CompletableFutureはcompletedになります。onExit().get()をコールすると、プロセスが終了するのを待機し、プロセスを返します。 将来は、プロセスがdoneかwaitかをチェックして終了するために使用できます。 CompletableFutureの「取消」はプロセスに影響しません。ProcessBuilder.start()から返されたプロセスは、デフォルトの実装をオーバーライドして、プロセスの終了を待機する効率的なメカニズムを提供します。- APIのノート:
onExitは、プロセスの結果に対する追加の同時実行性と便利なアクセスの両方を可能にするwaitForの代替手段です。 ラムダ式を使用して、プロセス実行の結果を評価できます。 値を使用する前に他の処理を実行する場合、onExitは、値が必要な場合にのみ現在のスレッドおよびブロックを解放する便利なメカニズムです。
たとえば、プロセスを起動して2つのファイルを比較し、同じ場合はブール値を取得します:
ComputableFutureが完了して依存アクションが起動される前に、プロセスがProcess p = new ProcessBuilder("cmp", "f1", "f2").start(); Future<Boolean> identical = p.onExit().thenApply(p1 -> p1.exitValue() == 0); ... if (identical.get()) { ... }isAlive()で終了していることがわかります。- 実装要件:
- この実装では、正常に戻されるまで、個別のスレッドで
waitFor()が繰り返し実行されます。waitForの実行が中断された場合、スレッドの割込みステータスは保持されます。waitFor()が正常に戻されると、プロセスの終了ステータスに関係なく、CompletableFutureはcompletedになります。 多数のプロセスが同時に待機される場合、この実装ではスレッド・スタックに大量のメモリーが消費される可能性があります。外部実装では、このメソッドをオーバーライドし、より効率的な実装を提供する必要があります。 たとえば、基礎となるプロセスに委任するには、次のようにします:
public CompletableFuture<Process> onExit() { return delegate.onExit().thenApply(p -> this); } - 戻り値:
- プロセス用の新しい
CompletableFuture<Process> - 導入されたバージョン:
- 9
-
toHandle
public ProcessHandle toHandle()プロセスのProcessHandleを返します。ProcessオブジェクトはProcessBuilder.start()とRuntime.exec(java.lang.String)によって返され、toHandleは、SecurityManagerとRuntimePermission("manageProcess")のチェックを含むProcessHandle.of(pid)の同等物として実装されます。- 実装要件:
- この実装は、
UnsupportedOperationExceptionのインスタンスをスローし、他のアクションは実行しません。 サブクラスは、このメソッドをオーバーライドして、プロセスにProcessHandleを指定する必要があります。 オーバーライドされないかぎり、メソッドpid()、info()、children()およびdescendants()は、ProcessHandleに対して動作します。 - 戻り値:
- プロセスのProcessHandleを返す
- 例外:
UnsupportedOperationException- Process実装がこの操作をサポートしていない場合SecurityException- セキュリティ・マネージャがインストールされていて、RuntimePermission("manageProcess")を拒否した場合- 導入されたバージョン:
- 9
-
info
public ProcessHandle.Info info()プロセスに関する情報のスナップショットを返します。ProcessHandle.Infoインスタンスには、プロセスに関する情報(使用可能な場合)を返すアクセサ・メソッドがあります。- 実装要件:
- この実装は、プロセスに関する情報を:
toHandle().info()。 - 戻り値:
- プロセスに関する情報のスナップショット(常にnull以外)
- 例外:
UnsupportedOperationException- Process実装がこの操作をサポートしていない場合- 導入されたバージョン:
- 9
-
children
public Stream<ProcessHandle> children()プロセスの直接の子のスナップショットを返します。 直接の子プロセスの親がプロセスです。 通常、「生きていない」のプロセスは子を持ちません。プロセスが作成され、非同期で終了するNote。 プロセスがaliveである保証はありません。
- 実装要件:
- この実装は、直接の子を次のように返します:
toHandle().children()。 - 戻り値:
- プロセスの直接の子プロセスであるプロセスの一連のProcessHandle
- 例外:
UnsupportedOperationException- Process実装がこの操作をサポートしていない場合SecurityException- セキュリティ・マネージャがインストールされていて、RuntimePermission("manageProcess")を拒否した場合- 導入されたバージョン:
- 9
-
descendants
public Stream<ProcessHandle> descendants()プロセスの子孫のスナップショットを返します。 プロセスの子孫は、プロセスの子とそれらの子の子孫です。 通常、「生きていない」のプロセスは子を持ちません。プロセスが作成され、非同期で終了するNote。 プロセスがaliveである保証はありません。
- 実装要件:
- この実装は、すべての子を:
toHandle().descendants()。 - 戻り値:
- プロセスの子孫であるプロセスのProcessHandlesの連続ストリーム
- 例外:
UnsupportedOperationException- Process実装がこの操作をサポートしていない場合SecurityException- セキュリティ・マネージャがインストールされていて、RuntimePermission("manageProcess")を拒否した場合- 導入されたバージョン:
- 9
-