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
クラスのメソッドを使用してprocess I/Oをリダイレクトすることもできます。
Process
オブジェクトへの参照がなくなってもプロセスは強制終了されませんが、プロセスは非同期的に実行され続けます。
Process
オブジェクトによって表されるプロセスが、Process
オブジェクトを所有するJavaプロセスに対して非同期にまたは同時に実行する必要はありません。
1.5以降でProcess
を作成するための推奨の方法は、ProcessBuilder.start()
です。
Processのサブクラスは、「プロセスID」、「プロセスに関する情報」、「直接の子プロセスたち」、および「直接の子プロセスたちとその子プロセスたちの子孫」を含む完全に機能するProcessを提供するために、onExit()
およびtoHandle()
メソッドをオーバーライドする必要があります。 基本となるProcessまたは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のノート:
getInputStream()
およびinputReader
は、極めて慎重に使用してください。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のノート:
- プロセスはすぐに終了しないことがあります。つまり、
isAlive()
は、destroyForcibly()
が呼び出された後、短期間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
のインスタンスをスローし、他のアクションを実行しません。 - 戻り値:
true
destroy()
の実装が正常にプロセスを終了する場合。そうでなければ、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()
を呼び出すと、プロセスが終了してプロセスが返されるのを待ちます。 Futureは、プロセスが終了するかどうかを確認するために、プロセスが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を返します。ProcessBuilder.start()
とRuntime.exec(java.lang.String)
によって返されるProcess
オブジェクトの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()プロセスの直接の子のスナップショットを返します。 直接の子プロセスの親プロセスです。 通常、生存していないプロセスには子がありません。プロセスは非同期で作成され、終了することに注意してください。 プロセスが生存している保証はありません。
- 実装要件:
- この実装は、直接の子たちを次のように返します:
toHandle().children()
。 - 戻り値:
- プロセスの直接の子プロセスであるプロセスの一連のProcessHandle
- 例外:
UnsupportedOperationException
- Process実装がこの操作をサポートしていない場合SecurityException
- セキュリティ・マネージャがインストールされていて、RuntimePermission("manageProcess")を拒否した場合- 導入されたバージョン:
- 9
-
descendants
public Stream<ProcessHandle> descendants()プロセスの子孫のスナップショットを返します。 プロセスの子孫は、再帰的にプロセスの子と子の子孫です。 通常、生存していないプロセスには子がありません。プロセスは非同期で作成され、終了することに注意してください。 プロセスが生存している保証はありません。
- 実装要件:
- この実装は、すべての子を次のように返します:
toHandle().descendants()
。 - 戻り値:
- プロセスの子孫であるプロセスのProcessHandlesの連続ストリーム
- 例外:
UnsupportedOperationException
- Process実装がこの操作をサポートしていない場合SecurityException
- セキュリティ・マネージャがインストールされていて、RuntimePermission("manageProcess")を拒否した場合- 導入されたバージョン:
- 9
-