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 void
destroy()
プロセスを強制終了します。プロセスを強制的に停止します。final BufferedReader
プロセスの標準エラーに接続されたBufferedReader
を返します。final BufferedReader
errorReader
(Charset charset) Charsetを使用してこのプロセスの標準エラーに接続されたBufferedReader
を返します。abstract int
プロセスの終了値を返します。abstract InputStream
プロセスのエラー出力に接続された入力ストリームを返します。abstract InputStream
プロセスの通常の出力に接続された入力ストリームを返します。abstract OutputStream
プロセスの通常入力に接続された出力ストリームを返します。info()
プロセスに関する情報のスナップショットを返します。final BufferedReader
プロセスの標準出力に接続されたBufferedReader
を返します。final BufferedReader
inputReader
(Charset charset) Charsetを使用してこのプロセスの標準出力に接続されたBufferedReader
を返します。boolean
isAlive()
このProcess
によって表されるプロセスが動作しているかどうかをテストします。onExit()
プロセスの終了のCompletableFuture<Process>
を返します。final BufferedWriter
ネイティブ・エンコーディングを使用して、プロセスの通常入力に接続されたBufferedWriter
を返します。final BufferedWriter
outputWriter
(Charset charset) Charsetを使用してプロセスの通常入力に接続されたBufferedWriter
を返します。long
pid()
プロセスのネイティブ・プロセスIDを返します。boolean
destroy()
の実装が通常プロセスを終了する場合はtrue
を戻し、destroy
の実装を強制的に戻してプロセスをすぐに終了する場合はfalse
を戻します。toHandle()
プロセスのProcessHandleを返します。abstract int
waitFor()
必要な場合に、この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つのファイルを比較し、同じ場合はブール値を取得します: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
-